package com.sonic.common.utils;

import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

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

/**
 * 国际化语言对象获取工具类
 * @Author code
 * @Date 2022/1/6
 * @Version 1.0
 */
@Component
public class LocaleUtils {

    /**默认语言配置*/
    private static final String DEFAULT_LANGUAGE = "en";

    /**所有有效的语言配置列表  不配置默认为en 英文*/
    private static List<String> allLang;

    /**默认使用的语言配置列表  不配置默认为en 英文*/
    private static String defaultLang;

    @Value("${language.available:en}")
    public void setAllLang(String allLangStr) {
        List<String> langList = Lists.newArrayList(allLangStr.split(","));
        allLang = langList;
    }

    @Value("${language.default:en}")
    public void setDefaultLang(String defaultLangStr) {
        defaultLang = defaultLangStr;
    }

    /**
     * 从当前线程中获取绑定的语言环境，获取到的语言环境不为配置的语言环境的话直接使用默认的语言环境
     * @return
     */
    public static Locale getLocale() {
        Locale locale = LocaleContextHolder.getLocale();
        return getLocaleAndDefault(locale);
    }

    /**
     * 获取用户使用的语言 国际化处理
     * @param httpServletRequest
     * @return
     */
    public static Locale getLocale(HttpServletRequest httpServletRequest) {
        Locale locale = httpServletRequest.getLocale();
        if(locale == null) {
            return new Locale(getDefaultLang());
        }
        return getLocaleAndDefault(locale);
    }

    /**
     * 获取用户使用的语言 国际化处理
     * @param lang
     * @return
     */
    public static Locale getLocale(String lang) {
        if(StringUtils.isEmpty(lang)) {
            return new Locale(getDefaultLang());
        }
        return getLocaleAndDefault(lang);
    }

    /**
     * 获取用户使用的语言 国际化处理
     * @param locale
     * @return
     */
    public static Locale getLocaleAndDefault(Locale locale) {
        if(locale == null || StringUtils.isEmpty(locale.getLanguage())) {
            return new Locale(getDefaultLang());
        }
        return getAllLang().contains(locale.getLanguage()) ? locale : new Locale(getDefaultLang());
    }

    /**
     * 获取用户使用的语言 国际化处理
     * @param lang
     * @return
     */
    public static Locale getLocaleAndDefault(String lang) {
        if(StringUtils.isEmpty(lang)) {
            return new Locale(getDefaultLang());
        }
        return getAllLang().contains(lang) ? new Locale(lang) : new Locale(getDefaultLang());
    }

    /**
     * 根据语言对象获取语言字符
     * @param locale
     * @return
     */
    public static String getLanguage(Locale locale) {
        if(locale == null || StringUtils.isEmpty(locale.getLanguage())) {
            return getDefaultLang();
        }
        return getAllLang().contains(locale.getLanguage()) ? locale.getLanguage() : getDefaultLang();
    }


    /**
     * 处理包扫描没有扫描到的时候的兜底默认处理
     * @return
     */
    public static List<String> getAllLang() {
        if(CollectionUtils.isEmpty(allLang)) {
            allLang = Lists.newArrayList(DEFAULT_LANGUAGE);
            return allLang;
        }
        return allLang;
    }

    /**
     * 处理包扫描没有扫描到的时候的兜底默认处理
     * @return
     */
    public static String getDefaultLang() {
        if(StringUtils.isEmpty(defaultLang)) {
            return DEFAULT_LANGUAGE;
        }
        return defaultLang;
    }
}
