import type { Language } from 'element-plus/es/locale';

import type { App } from 'vue';

import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';

import { ref } from 'vue';

import {
  $t,
  setupI18n as coreSetup,
  getSystemLanguage,
  loadLocalesMapFromDir,
} from '@vben/locales';
import { preferences } from '@vben/preferences';

import dayjs from 'dayjs';
import defaultLocale from 'element-plus/es/locale/lang/zh-cn';

const elementLocale = ref<Language>(defaultLocale);

const modules = import.meta.glob([
  './langs/*/about.json',
  './langs/*/account-settings.json',
  './langs/*/api-token.json',
  './langs/*/ai-platform.json',
  './langs/*/announcement.json',
  './langs/*/application.json',
  './langs/*/authentication.json',
  './langs/*/chat.json',
  './langs/*/common.json',
  './langs/*/dept.json',
  './langs/*/dashboard-design.json',
  './langs/*/dingtalk-sync.json',
  './langs/*/dict.json',
  './langs/*/feishu-sync.json',
  './langs/*/file-manager.json',
  './langs/*/loginLog.json',
  './langs/*/menu.json',
  './langs/*/menu-title.json',
  './langs/*/message.json',
  './langs/*/org-chart.json',
  './langs/*/page.json',
  './langs/*/page-manager.json',
  './langs/*/permission.json',
  './langs/*/post.json',
  './langs/*/role.json',
  './langs/*/system-config.json',
  './langs/*/system.json',
  './langs/*/ui.json',
  './langs/*/ui-config.json',
  './langs/*/user-avatar.json',
  './langs/*/user.json',
  './langs/*/wecom-sync.json',
]);

const localesMap = loadLocalesMapFromDir(
  /\.\/langs\/([^/]+)\/(.*)\.json$/,
  modules,
);

/**
 * 加载应用特有的语言包
 * 这里也可以改造为从服务端获取翻译数据
 * @param lang
 */
async function loadMessages(lang: SupportedLanguagesType) {
  const [appLocaleMessages] = await Promise.all([
    localesMap[lang]?.(),
    loadThirdPartyMessage(lang),
  ]);
  return appLocaleMessages?.default || {};
}

/**
 * 加载第三方组件库的语言包
 * @param lang
 */
async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
  await Promise.all([loadElementLocale(lang), loadDayjsLocale(lang)]);
}

/**
 * 加载dayjs的语言包
 * @param lang
 */
async function loadDayjsLocale(lang: SupportedLanguagesType) {
  let locale;
  switch (lang) {
    case 'en-US': {
      locale = await import('dayjs/locale/en');
      break;
    }
    case 'zh-CN': {
      locale = await import('dayjs/locale/zh-cn');
      break;
    }
    case 'zh-TW': {
      locale = await import('dayjs/locale/zh-tw');
      break;
    }
    // 默认使用英语
    default: {
      locale = await import('dayjs/locale/en');
    }
  }
  if (locale) {
    dayjs.locale(locale);
  } else {
    console.error(`Failed to load dayjs locale for ${lang}`);
  }
}

/**
 * 加载element-plus的语言包
 * @param lang
 */
async function loadElementLocale(lang: SupportedLanguagesType) {
  switch (lang) {
    case 'en-US': {
      elementLocale.value = (
        await import('element-plus/es/locale/lang/en')
      ).default;
      break;
    }
    case 'zh-CN': {
      elementLocale.value = defaultLocale;
      break;
    }
    case 'zh-TW': {
      elementLocale.value = (
        await import('element-plus/es/locale/lang/zh-tw')
      ).default;
      break;
    }
  }
}

async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
  // 如果是跟随系统，获取系统语言
  const locale = preferences.app.locale;
  const actualLocale = locale === 'auto' ? getSystemLanguage() : locale;

  await coreSetup(app, {
    defaultLocale: actualLocale,
    loadMessages,
    missingWarn: !import.meta.env.PROD,
    ...options,
  });
}

export { $t, elementLocale, setupI18n };
