export const SUPPORTED_LOCALES = ["ko", "en", "zh", "ja", "vi", "ru"] as const;

export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];

export type LocaleOption = {
  code: SupportedLocale;
  flag: string;
  htmlLang: string;
  nativeLabel: string;
};

export const DEFAULT_LOCALE: SupportedLocale = "en";
export const LOCALE_COOKIE_NAME = "official_mail_locale";

export const LOCALE_OPTIONS: readonly LocaleOption[] = [
  { code: "ko", flag: "🇰🇷", htmlLang: "ko-KR", nativeLabel: "한국어" },
  { code: "en", flag: "🇺🇸", htmlLang: "en-US", nativeLabel: "English" },
  { code: "zh", flag: "🇨🇳", htmlLang: "zh-CN", nativeLabel: "简体中文" },
  { code: "ja", flag: "🇯🇵", htmlLang: "ja-JP", nativeLabel: "日本語" },
  { code: "vi", flag: "🇻🇳", htmlLang: "vi-VN", nativeLabel: "Tiếng Việt" },
  { code: "ru", flag: "🇷🇺", htmlLang: "ru-RU", nativeLabel: "Русский" },
] as const;

const LOCALE_BY_COUNTRY: Readonly<Record<string, SupportedLocale>> = {
  KR: "ko",
  CN: "zh",
  HK: "zh",
  MO: "zh",
  TW: "zh",
  JP: "ja",
  VN: "vi",
  RU: "ru",
  BY: "ru",
  KZ: "ru",
  KG: "ru",
};

const LOCALE_ALIASES: Readonly<Record<string, SupportedLocale>> = {
  ko: "ko",
  "ko-kr": "ko",
  en: "en",
  "en-us": "en",
  "en-gb": "en",
  zh: "zh",
  "zh-cn": "zh",
  "zh-hans": "zh",
  "zh-tw": "zh",
  "zh-hant": "zh",
  ja: "ja",
  "ja-jp": "ja",
  vi: "vi",
  "vi-vn": "vi",
  ru: "ru",
  "ru-ru": "ru",
};

export function normalizeSupportedLocale(value: string | null | undefined) {
  const normalized = String(value ?? "").trim().toLowerCase();
  return LOCALE_ALIASES[normalized] ?? null;
}

export function getLocaleOption(locale: SupportedLocale) {
  return LOCALE_OPTIONS.find((option) => option.code === locale) ?? LOCALE_OPTIONS[1];
}

export function resolveLocaleFromCountry(countryCode: string | null | undefined) {
  const normalized = String(countryCode ?? "").trim().toUpperCase();

  if (!normalized) {
    return null;
  }

  return LOCALE_BY_COUNTRY[normalized] ?? DEFAULT_LOCALE;
}

export function resolveLocaleFromAcceptLanguage(value: string | null | undefined) {
  const languages = String(value ?? "")
    .split(",")
    .map((part) => part.split(";")[0]?.trim())
    .filter(Boolean);

  for (const language of languages) {
    const exact = normalizeSupportedLocale(language);

    if (exact) {
      return exact;
    }

    const base = normalizeSupportedLocale(language?.split("-")[0]);

    if (base) {
      return base;
    }
  }

  return DEFAULT_LOCALE;
}
