"use client";

import { useMemo, useSyncExternalStore } from "react";

import {
  getMeetingRequestFont,
  i18n,
  type UiLang,
} from "./meeting-request-i18n";

const LANGUAGE_STORAGE_KEYS = [
  "gpsf-lang",
  "app-lang",
  "ui-lang",
  "lang",
  "language",
  "locale",
  "NEXT_LOCALE",
  "i18nextLng",
];

function normalizeLang(value: string | null | undefined): UiLang | null {
  if (!value) return null;

  const lang = value.toLowerCase();

  if (
    lang === "km" ||
    lang === "kh" ||
    lang === "khmer" ||
    lang.startsWith("km-") ||
    lang.startsWith("kh-")
  ) {
    return "km";
  }

  if (lang === "en" || lang.startsWith("en-")) {
    return "en";
  }

  return null;
}

function readGlobalLang(defaultLang: UiLang): UiLang {
  if (typeof window === "undefined") {
    return defaultLang;
  }

  const html = document.documentElement;

  const htmlLang =
    normalizeLang(html.lang) ||
    normalizeLang(html.dataset.lang) ||
    normalizeLang(html.dataset.locale) ||
    normalizeLang(html.getAttribute("data-language"));

  if (htmlLang) {
    return htmlLang;
  }

  for (const key of LANGUAGE_STORAGE_KEYS) {
    const savedLang = normalizeLang(window.localStorage.getItem(key));

    if (savedLang) {
      return savedLang;
    }
  }

  return defaultLang;
}

function subscribeLanguageChange(callback: () => void) {
  if (typeof window === "undefined") {
    return () => {};
  }

  const notify = () => {
    window.setTimeout(callback, 0);
  };

  window.addEventListener("storage", notify);
  window.addEventListener("languagechange", notify);
  window.addEventListener("gpsf-language-change", notify);
  window.addEventListener("app-language-change", notify);
  window.addEventListener("focus", notify);
  window.addEventListener("click", notify);

  return () => {
    window.removeEventListener("storage", notify);
    window.removeEventListener("languagechange", notify);
    window.removeEventListener("gpsf-language-change", notify);
    window.removeEventListener("app-language-change", notify);
    window.removeEventListener("focus", notify);
    window.removeEventListener("click", notify);
  };
}

export function useMeetingRequestI18n(defaultLang: UiLang = "en") {
  const lang = useSyncExternalStore(
    subscribeLanguageChange,
    () => readGlobalLang(defaultLang),
    () => defaultLang
  );

  return useMemo(
    () => ({
      lang,
      t: i18n[lang],
      fontFamily: getMeetingRequestFont(lang),
    }),
    [lang]
  );
}