"use client";

import { useEffect, useState } from "react";

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

const LANGUAGE_STORAGE_KEYS = [
  "gpsf_language",
  "gpsf_lang",
  "app-language",
  "app_language",
  "language",
  "lang",
  "locale",
  "NEXT_LOCALE",
  "i18nextLng",
  "selectedLanguage",
  "selected_language",
];

function normalizeLanguage(value: string | null | undefined): UiLang {
  const raw = String(value || "").trim().toLowerCase();

  if (
    raw === "en" ||
    raw === "eng" ||
    raw === "english" ||
    raw.startsWith("en-") ||
    raw.includes('"en"')
  ) {
    return "en";
  }

  return "km";
}

function readFromLocalStorage(): UiLang | null {
  if (typeof window === "undefined") return null;

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

    if (value) {
      return normalizeLanguage(value);
    }
  }

  return null;
}

function readFromCookie(): UiLang | null {
  if (typeof document === "undefined") return null;

  const cookies = document.cookie.split(";").map((item) => item.trim());

  for (const cookie of cookies) {
    const [key, ...valueParts] = cookie.split("=");

    if (LANGUAGE_STORAGE_KEYS.includes(key)) {
      return normalizeLanguage(decodeURIComponent(valueParts.join("=")));
    }
  }

  return null;
}

function readFromHtml(): UiLang | null {
  if (typeof document === "undefined") return null;

  const value =
    document.documentElement.lang ||
    document.documentElement.dataset.language ||
    document.documentElement.dataset.lang ||
    document.body?.dataset.language ||
    document.body?.dataset.lang;

  if (!value) return null;

  return normalizeLanguage(value);
}

function readLanguage(): UiLang {
  return readFromLocalStorage() ?? readFromCookie() ?? readFromHtml() ?? "km";
}

export function useMeetingRequestI18n(): UiLang {
  const [language, setLanguageState] = useState<UiLang>("km");

  useEffect(() => {
    const updateLanguage = () => {
      const nextLanguage = readLanguage();

      setLanguageState((currentLanguage) =>
        currentLanguage === nextLanguage ? currentLanguage : nextLanguage,
      );
    };

    updateLanguage();

    window.addEventListener("storage", updateLanguage);
    window.addEventListener("gpsf-language-change", updateLanguage);
    window.addEventListener("app-language-change", updateLanguage);
    window.addEventListener("languagechange", updateLanguage);

    const observer = new MutationObserver(updateLanguage);

    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["lang", "data-language", "data-lang"],
    });

    if (document.body) {
      observer.observe(document.body, {
        attributes: true,
        attributeFilter: ["data-language", "data-lang"],
      });
    }

    return () => {
      window.removeEventListener("storage", updateLanguage);
      window.removeEventListener("gpsf-language-change", updateLanguage);
      window.removeEventListener("app-language-change", updateLanguage);
      window.removeEventListener("languagechange", updateLanguage);
      observer.disconnect();
    };
  }, []);

  return language;
}