/**

 * Multi-language related operations

 */

import type { LocaleType } from '/#/config';



import { i18n } from './setupI18n';

import { useLocaleStoreWithOut } from '/@/store/modules/locale';

import { unref, computed } from 'vue';

import { loadLocalePool, setHtmlPageLang } from './helper';



interface LangModule {

  message: Recordable;

  dateLocale: Recordable;

  dateLocaleName: string;

}



function setI18nLanguage(locale: LocaleType) {

  const localeStore = useLocaleStoreWithOut();



  if (i18n.mode === 'legacy') {

    i18n.global.locale = locale;

  } else {

    (i18n.global.locale as any).value = locale;

  }

  localeStore.setLocaleInfo({ locale });

  setHtmlPageLang(locale);

}



export function useLocale() {

  const localeStore = useLocaleStoreWithOut();

  const getLocale = computed(() => localeStore.getLocale);

  const getShowLocalePicker = computed(() => localeStore.getShowPicker);



  const getAntdLocale = computed((): any => {

    return i18n.global.getLocaleMessage(unref(getLocale))?.antdLocale ?? {};

  });



  // Switching the language will change the locale of useI18n

  // And submit to configuration modification

  async function changeLocale(locale: LocaleType) {

    const globalI18n = i18n.global;

    const currentLocale = unref(globalI18n.locale);

    if (currentLocale === locale) {

      return locale;

    }



    if (loadLocalePool.includes(locale)) {

      setI18nLanguage(locale);

      return locale;

    }

    const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule;

    if (!langModule) return;



    const { message } = langModule;



    globalI18n.setLocaleMessage(locale, message);

    loadLocalePool.push(locale);



    setI18nLanguage(locale);

    return locale;

  }



  return {

    getLocale,

    getShowLocalePicker,

    changeLocale,

    getAntdLocale,

  };

}