package com.copy.trade.config;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

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

/**
 * 基于请求头的国际化语言解析器
 * 优先级：请求头 lang > URL 参数 lang > Accept-Language 头 > 默认语言（英文）
 * 解决移动端无法维持 Session 导致语言回落为中文的问题
 *
 * @author system
 * @date 2026-05-15
 */
public class HeaderLocaleResolver implements LocaleResolver {

    /** 默认语言，未携带语言参数时使用 */
    private Locale defaultLocale = Locale.US;

    /**
     * 从请求中解析语言
     *
     * @param request HTTP 请求
     * @return 解析到的 Locale
     */
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        // 1. 优先从请求头 lang 读取（移动端 App 方式）
        String lang = request.getHeader("lang");

        // 2. 请求头没有则尝试 URL 参数 lang（Web 方式）
        if (!StringUtils.hasText(lang)) {
            lang = request.getParameter("lang");
        }

        // 3. 解析语言标签
        if (StringUtils.hasText(lang)) {
            try {
                // 兼容下划线格式（zh_CN）和连字符格式（zh-CN）
                return StringUtils.parseLocale(lang);
            } catch (Exception e) {
                // 格式非法时继续走 Accept-Language
            }
        }

        // 4. 尝试 Accept-Language 请求头
        String acceptLanguage = request.getHeader("Accept-Language");
        if (StringUtils.hasText(acceptLanguage)) {
            try {
                Locale locale = request.getLocale();
                if (locale != null && StringUtils.hasText(locale.getLanguage())) {
                    return locale;
                }
            } catch (Exception e) {
                // 解析失败时使用默认语言
            }
        }

        // 5. 使用默认语言
        return defaultLocale;
    }

    /**
     * 无状态解析器不支持主动设置语言
     *
     * @param request  HTTP 请求
     * @param response HTTP 响应
     * @param locale   目标 Locale（忽略）
     */
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        // 无状态解析器不存储语言，忽略此操作
    }
}
