package com.corewing.app.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

/**
 * 国际化配置类
 * 从 HTTP Header 中的 Accept-Language 或 lang 参数读取语言设置
 */
@Configuration
public class I18nConfig implements WebMvcConfigurer {

    /**
     * 配置消息资源
     */
    @Bean
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        // 设置资源文件的基础名称（不包含语言代码和.properties后缀）
        messageSource.setBasename("i18n/messages");
        // 设置默认编码
        messageSource.setDefaultEncoding("UTF-8");
        // 设置缓存时间（秒），-1表示永久缓存，0表示不缓存
        messageSource.setCacheSeconds(3600);
        // 找不到对应的消息key时，返回key本身而不是抛出异常
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }

    /**
     * 配置语言环境解析器
     * 从 HTTP Header 的 Accept-Language 读取语言设置
     */
    @Bean
    public LocaleResolver localeResolver() {
        return new HeaderLocaleResolver();
    }

    /**
     * 配置拦截器（可选）
     * 支持通过URL参数 ?lang=zh_CN 切换语言
     */
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        // 设置请求参数名
        interceptor.setParamName("lang");
        return interceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }

    /**
     * 自定义 LocaleResolver，从 Header 中读取语言设置
     */
    private static class HeaderLocaleResolver implements LocaleResolver {

        private static final Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;

        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            // 1. 优先从 Accept-Language header 读取
            String language = request.getHeader("Accept-Language");

            // 2. 如果没有，尝试从自定义 lang header 读取
            if (language == null || language.trim().isEmpty()) {
                language = request.getHeader("lang");
            }

            // 3. 解析语言代码
            if (language != null && !language.trim().isEmpty()) {
                try {
                    // 支持格式: zh_CN, zh-CN, en_US, en-US
                    String normalizedLang = language.replace("-", "_");
                    String[] parts = normalizedLang.split("_");

                    if (parts.length == 2) {
                        return new Locale(parts[0], parts[1]);
                    } else if (parts.length == 1) {
                        return new Locale(parts[0]);
                    }
                } catch (Exception e) {
                    // 解析失败，使用默认语言
                }
            }

            // 4. 返回默认语言（中文）
            return DEFAULT_LOCALE;
        }

        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
            // Header方式不支持设置语言环境
            throw new UnsupportedOperationException(
                    "Cannot change HTTP header - use Accept-Language or lang header");
        }
    }
}
