package com.ruoyi.web.config;

import com.ruoyi.dk.service.HomeSettingService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;

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

/**
 * i18n配置，用于处理语言本地化设置。
 *
 * @author liuyanqiang
 * @version 1.0.0
 * @since 2023/06/15 09:41
 **/
@Configuration
public class I18nConfig implements LocaleResolver {

    @Autowired
    private HomeSettingService homeSettingService;

    /**
     * 根据请求中的Accept-Language头部解析出语言设置。
     * 如果没有指定语言或语言设置不完整，则默认为中文设置。
     *
     * @param request HTTP请求对象
     * @return {@link Locale } 解析后的语言设置Locale对象
     * @author liuyanqiang
     * @since 2023/06/15 09:42
     **/
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        // 默认语言设置为中文
        String defaultLocal = homeSettingService.getHomeSetting().getDefaultLocal();
        Locale locale = null;
        // 从请求的头部获取Accept-Language标头，该标头指定了客户端期望的语言
        String language = request.getHeader("Sass-Language");
        String lang = request.getParameter("lang");
        if (StringUtils.isNotBlank(lang)) {
            language = lang;
        }
        if(StringUtils.isBlank(language)){
            language = defaultLocal;
        }
        // 检查请求的语言是否非空
        if (StringUtils.isNotBlank(language)) {
            // 将语言字符串拆分为语言和国家/地区代码
            String[] splitLanguage = language.split("_");
            // 检查是否有语言和国家/地区代码
            if (splitLanguage.length > 1) {
                // 根据语言和国家/地区代码创建新的Locale对象
                locale = new Locale(splitLanguage[0], splitLanguage[1]);
            }
        }
        if(locale == null){
            locale = Locale.CHINA;
        }
        // 返回解析得到的Locale对象作为解析后的语言设置
        return locale;
    }

    /**
     * 设置语言设置时的回调方法。
     * 在此实现中，不执行任何操作，忽略对语言设置的更改。
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @param locale 语言设置的Locale对象
     * @author liuyanqiang
     * @since 2023/06/15 09:43
     **/
    @Override
    public void setLocale(
            HttpServletRequest request,
            HttpServletResponse response,
            Locale locale) {
        // 此方法不执行任何操作，忽略对语言设置的更改
    }

    /**
     * 创建LocaleResolver bean，用于处理语言设置。
     *
     * @return {@link LocaleResolver }
     * @author liuyanqiang
     * @since 2023/06/15 09:44
     **/
    @Bean
    public LocaleResolver localeResolver() {
        // 返回当前类作为LocaleResolver的实例
        return new I18nConfig();
    }
}
