import i18n from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import { initReactI18next } from 'react-i18next';

import { getLangTarget } from './langMap';

/**
// ****************** 不使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 ******************
// 自动导入所有翻译文件
const modules = import.meta.glob('@/locales/*.ts', { eager: true });
const resources: Record<string, { translation: Record<string, any> }> = {};
const languageCodes = new Set<string>();
Object.entries(modules).forEach(([path, module]) => {
    const lang = path.split('/').pop()?.replace('.ts', '') || '';
    resources[lang] = {
        translation: (module as { default: Record<string, string> }).default,
    };
    languageCodes.add(lang);
    const baseCode = lang.split('-')[0];
    languageCodes.add(baseCode);
});
const supportedLanguages = Array.from(languageCodes).sort();

// 检查语言是否有对应的翻译文件
const hasTranslation = (lang: string) => {
    return lang in resources;
};

// 获取URL中的语言参数
const getLangFromUrl = () => {
    if (typeof window === 'undefined') return null;

    const searchParams = new URLSearchParams(window.location.search);
    const searchLang = searchParams.get('lang');
    if (searchLang) return searchLang;

    const hash = window.location.hash;
    const hashParams = new URLSearchParams(hash.split('?')[1] || '');
    return hashParams.get('lang');
};

// 获取浏览器语言
const getBrowserLang = () => {
    if (typeof window === 'undefined') return 'en-US';
    return getLangTarget(navigator.language);
};

// 初始化语言
const initLang = () => {
    const urlLang = getLangFromUrl();
    if (urlLang) {
        const targetLang = getLangTarget(urlLang);
        return hasTranslation(targetLang) ? targetLang : 'en-US';
    }
    const browserLang = getBrowserLang();
    return hasTranslation(browserLang) ? browserLang : 'en-US';
};

i18n.use(initReactI18next).init({
    supportedLngs: supportedLanguages,
    lng: initLang(), // 默认语言为英文
    fallbackLng: 'en-US', // 后备语言为英文
    debug:
        import.meta.env.VITE_APP_ENV === 'development' || import.meta.env.VITE_APP_ENV === 'test',
    interpolation: {
        escapeValue: false,
        prefix: '{',
        suffix: '}',
    },
    resources,
});
// ****************** 不使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 end ******************
*/

/**
// ****************** 使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 ******************
// 自动导入所有翻译文件
const modules = import.meta.glob('@/locales/*.ts', { eager: true });
const resources: Record<string, { translation: Record<string, any> }> = {};
const languageCodes = new Set<string>();
Object.entries(modules).forEach(([path, module]) => {
    const lang = path.split('/').pop()?.replace('.ts', '') || '';
    resources[lang] = {
        translation: (module as { default: Record<string, string> }).default,
    };
    languageCodes.add(lang);
    const baseCode = lang.split('-')[0];
    languageCodes.add(baseCode);
});
const supportedLanguages = Array.from(languageCodes).sort();

// 初始化i18n
i18n.use(LanguageDetector)
    .use(initReactI18next)
    .init({
        supportedLngs: supportedLanguages,
        fallbackLng: 'en-US',
        detection: {
            order: ['querystring', 'navigator'],
            lookupQuerystring: 'lang',
            caches: [],
            convertDetectedLanguage: (lang) => {
                const result = getLangTarget(lang);
                console.warn(`convert detected language ~ lang: ${lang} ->  ${result}`);
                return result;
            },
        },
        debug:
            import.meta.env.VITE_APP_ENV === 'development' ||
            import.meta.env.VITE_APP_ENV === 'test',
        interpolation: {
            escapeValue: false,
            prefix: '{',
            suffix: '}',
        },
        resources,
    });
// ****************** 使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 ******************
*/

// ****************** 使用 LanguageDetector、支持按需加载翻译文件 时 i18n 的配置方法 ******************
// 匹配 locales 下所有 .ts，显式排除 dirMap.ts（fast-glob 否定语法）
const modules = import.meta.glob(['@/locales/*.ts', '!@/locales/dirMap.ts']);
const languageFiles: Record<string, () => Promise<any>> = {};
const languageCodes = new Set<string>();
Object.entries(modules).forEach(([path]) => {
    const lang = path.split('/').pop()?.replace('.ts', '') || '';
    languageFiles[lang] = modules[path];
    languageCodes.add(lang);
    const baseCode = lang.split('-')[0];
    languageCodes.add(baseCode);
});
const supportedLanguages = Array.from(languageCodes).sort();

const loadLanguage = async (lang: string) => {
    console.log('i18next: before loadLanguage:', lang);
    if (i18n.hasResourceBundle(lang, 'translation')) {
        return;
    }

    if (!languageFiles[lang]) {
        console.error(`i18next: language file not found for: ${lang}`);
        return;
    }

    try {
        const module = await languageFiles[lang]();
        const translations = (module as { default: Record<string, string> }).default;
        i18n.addResourceBundle(lang, 'translation', translations, true, true);
        console.log('i18next: successfully loaded language:', lang);
    } catch (error) {
        console.error(`i18next: failed to load language: ${lang}`, error);
    }
};

// 先监听语言变化，否则等初始化完成之后再监听，会导致接收不到初始化时的 languageChanged 事件，不加载初始语言的翻译文件
i18n.on('languageChanged', async (lang) => {
    console.log('i18next: onLanguageChanged--------', lang);
    if (!i18n.hasResourceBundle(lang, 'translation')) {
        await loadLanguage(lang);
        i18n.changeLanguage(lang);
    }
});

// 初始化i18n
i18n.use(LanguageDetector)
    .use(initReactI18next)
    .init({
        supportedLngs: supportedLanguages,
        fallbackLng: 'en-US',
        detection: {
            order: ['querystring', 'navigator'],
            lookupQuerystring: 'lang',
            caches: [],
            convertDetectedLanguage: (lang) => {
                const result = getLangTarget(lang);
                console.warn(`convert detected language ~ lang: ${lang} ->  ${result}`);
                return result;
            },
        },
        debug:
            import.meta.env.VITE_APP_ENV === 'development' ||
            import.meta.env.VITE_APP_ENV === 'test',
        interpolation: {
            escapeValue: false,
            prefix: '{',
            suffix: '}',
        },
        resources: {},
    });
// ****************** 使用 LanguageDetector、支持按需加载翻译文件 时 i18n 的配置方法 end ******************

export default i18n;
