"use client";

import { useEffect, useState } from "react";

export type WgIssuesLanguage = "en" | "km";

type TranslationKey =
  | "pageTitle"
  | "pageSubtitle"
  | "exportAsXlsx"
  | "exporting"
  | "exportSuccess"
  | "exportFailed"
  | "new"
  | "list"
  | "grid"
  | "allStatus"
  | "category"
  | "primaryAgency"
  | "year"
  | "progressReport"
  | "attachment"
  | "totalIssues"
  | "solved"
  | "inProgress"
  | "notAddressed"
  | "draft"
  | "newSubmission"
  | "previous"
  | "next"
  | "no"
  | "issue"
  | "issueCategory"
  | "issueDescription"
  | "recommendation"
  | "governmentDecision"
  | "status"
  | "issueReference"
  | "solutionReference"
  | "action"
  | "submittedDate"
  | "file"
  | "notAvailable"
  | "moreActions"
  | "viewDetail"
  | "edit"
  | "sendRequest"
  | "removeIssue"
  | "removeIssueQuestion"
  | "removeIssueUndone"
  | "back"
  | "cancel"
  | "close"
  | "issueDetail"
  | "issueUpdated"
  | "issueRemoved"
  | "removeFailed"
  | "submittedDetail"
  | "governmentPrimaryAgency"
  | "meetingDate"
  | "meetingReferenceDocument";

const translations: Record<WgIssuesLanguage, Record<TranslationKey, string>> = {
  en: {
    pageTitle: "Working Group A Issues",
    pageSubtitle: "Working Group A Issues",
    exportAsXlsx: "Export as xlsx",
    exporting: "Exporting...",
    exportSuccess: "Excel file downloaded successfully.",
    exportFailed: "Could not export issues.",
    new: "New",
    list: "List",
    grid: "Grid",
    allStatus: "All Status",
    category: "Category",
    primaryAgency: "Primary Agency",
    year: "Year",
    progressReport: "Progress Report",
    attachment: "Attachment",
    totalIssues: "Total Issues",
    solved: "Solved",
    inProgress: "In Progress",
    notAddressed: "Not Addressed",
    draft: "Draft",
    newSubmission: "New Submission",
    previous: "Previous",
    next: "Next",
    no: "No.",
    issue: "Issue",
    issueCategory: "Issue Category",
    issueDescription: "Issue Description",
    recommendation: "Recommendation",
    governmentDecision: "Government Decision",
    status: "Status",
    issueReference: "Issue Reference",
    solutionReference: "Solution Reference",
    action: "Action",
    submittedDate: "Submitted Date",
    file: "File",
    notAvailable: "Not available",
    moreActions: "More actions",
    viewDetail: "View Detail",
    edit: "Edit",
    sendRequest: "Send Request",
    removeIssue: "Remove Issue",
    removeIssueQuestion: "Are you sure you want to remove",
    removeIssueUndone: "This action cannot be undone.",
    back: "Back",
    cancel: "Cancel",
    close: "Close",
    issueDetail: "Issue Detail",
    issueUpdated: "Issue updated successfully.",
    issueRemoved: "Issue removed successfully.",
    removeFailed: "Could not remove the issue.",
    submittedDetail: "Submitted Detail",
    governmentPrimaryAgency: "Government Primary Agency",
    meetingDate: "Meeting Date",
    meetingReferenceDocument: "Meeting Reference Document",
  },
  km: {
    pageTitle: "បញ្ហាក្រុមការងារ A",
    pageSubtitle: "បញ្ហាក្រុមការងារ A",
    exportAsXlsx: "នាំចេញជា xlsx",
    exporting: "កំពុងនាំចេញ...",
    exportSuccess: "បានទាញយកឯកសារ Excel ដោយជោគជ័យ។",
    exportFailed: "មិនអាចនាំចេញបញ្ហាបានទេ។",
    new: "ថ្មី",
    list: "បញ្ជី",
    grid: "ក្រឡា",
    allStatus: "ស្ថានភាពទាំងអស់",
    category: "ប្រភេទ",
    primaryAgency: "ស្ថាប័នដឹកនាំ",
    year: "ឆ្នាំ",
    progressReport: "របាយការណ៍វឌ្ឍនភាព",
    attachment: "ឯកសារភ្ជាប់",
    totalIssues: "បញ្ហាសរុប",
    solved: "បានដោះស្រាយ",
    inProgress: "កំពុងដំណើរការ",
    notAddressed: "មិនទាន់ដោះស្រាយ",
    draft: "ព្រាង",
    newSubmission: "ការដាក់ស្នើថ្មី",
    previous: "មុន",
    next: "បន្ទាប់",
    no: "ល.រ",
    issue: "បញ្ហា",
    issueCategory: "ប្រភេទបញ្ហា",
    issueDescription: "ការពិពណ៌នាបញ្ហា",
    recommendation: "អនុសាសន៍",
    governmentDecision: "សេចក្ដីសម្រេចរបស់រាជរដ្ឋាភិបាល",
    status: "ស្ថានភាព",
    issueReference: "ឯកសារយោងបញ្ហា",
    solutionReference: "ឯកសារយោងដំណោះស្រាយ",
    action: "សកម្មភាព",
    submittedDate: "កាលបរិច្ឆេទដាក់ស្នើ",
    file: "ឯកសារ",
    notAvailable: "មិនមាន",
    moreActions: "សកម្មភាពបន្ថែម",
    viewDetail: "មើលលម្អិត",
    edit: "កែសម្រួល",
    sendRequest: "ផ្ញើសំណើ",
    removeIssue: "លុបបញ្ហា",
    removeIssueQuestion: "តើបងពិតជាចង់លុបបញ្ហា",
    removeIssueUndone: "សកម្មភាពនេះមិនអាចត្រឡប់វិញបានទេ។",
    back: "ត្រឡប់ក្រោយ",
    cancel: "បោះបង់",
    close: "បិទ",
    issueDetail: "ព័ត៌មានលម្អិតបញ្ហា",
    issueUpdated: "បានកែប្រែបញ្ហាដោយជោគជ័យ។",
    issueRemoved: "បានលុបបញ្ហាដោយជោគជ័យ។",
    removeFailed: "មិនអាចលុបបញ្ហាបានទេ។",
    submittedDetail: "ព័ត៌មានដាក់ស្នើ",
    governmentPrimaryAgency: "ស្ថាប័នរដ្ឋាភិបាលដឹកនាំ",
    meetingDate: "កាលបរិច្ឆេទប្រជុំ",
    meetingReferenceDocument: "ឯកសារយោងកិច្ចប្រជុំ",
  },
};

const knownTextTranslations: Record<string, Record<WgIssuesLanguage, string>> = {
  "All Status": { en: "All Status", km: "ស្ថានភាពទាំងអស់" },
  Category: { en: "Category", km: "ប្រភេទ" },
  "Primary Agency": { en: "Primary Agency", km: "ស្ថាប័នដឹកនាំ" },
  Year: { en: "Year", km: "ឆ្នាំ" },
  "Progress Report": { en: "Progress Report", km: "របាយការណ៍វឌ្ឍនភាព" },
  Attachment: { en: "Attachment", km: "ឯកសារភ្ជាប់" },

  "Total Issues": { en: "Total Issues", km: "បញ្ហាសរុប" },
  Solved: { en: "Solved", km: "បានដោះស្រាយ" },
  "In Progress": { en: "In Progress", km: "កំពុងដំណើរការ" },
  "Not Addressed": { en: "Not Addressed", km: "មិនទាន់ដោះស្រាយ" },
  Draft: { en: "Draft", km: "ព្រាង" },
  Saved: { en: "Saved", km: "បានរក្សាទុក" },
  "New Submission": { en: "New Submission", km: "ការដាក់ស្នើថ្មី" },

  "Not available": { en: "Not available", km: "មិនមាន" },
  Legislation: { en: "Legislation", km: "ច្បាប់" },
  Trade: { en: "Trade", km: "ពាណិជ្ជកម្ម" },
  Governance: { en: "Governance", km: "អភិបាលកិច្ច" },
  Market: { en: "Market", km: "ទីផ្សារ" },
  Procedure: { en: "Procedure", km: "នីតិវិធី" },
  Policy: { en: "Policy", km: "គោលនយោបាយ" },
  Taxation: { en: "Taxation", km: "ពន្ធដារ" },
  "Human Resource": { en: "Human Resource", km: "ធនធានមនុស្ស" },
};

export function tWgIssues(
  language: WgIssuesLanguage,
  key: TranslationKey,
): string {
  return translations[language]?.[key] ?? translations.en[key];
}

export function translateWgIssuesText(
  language: WgIssuesLanguage,
  value: string,
): string {
  return knownTextTranslations[value]?.[language] ?? value;
}

function normalizeLanguage(value?: string | null): WgIssuesLanguage | null {
  if (!value) return null;

  const lowerValue = value.toLowerCase();

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

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

  return null;
}

function readLanguageFromBrowser(): WgIssuesLanguage {
  if (typeof window === "undefined") return "en";

  const htmlLanguage = normalizeLanguage(document.documentElement.lang);

  if (htmlLanguage) return htmlLanguage;

  const firstPathSegment = window.location.pathname
    .split("/")
    .filter(Boolean)[0];

  const pathLanguage = normalizeLanguage(firstPathSegment);

  if (pathLanguage) return pathLanguage;

  const localStorageKeys = [
    "language",
    "locale",
    "lang",
    "NEXT_LOCALE",
    "i18nextLng",
    "app-language",
    "app-locale",
  ];

  for (const key of localStorageKeys) {
    const storageLanguage = normalizeLanguage(window.localStorage.getItem(key));

    if (storageLanguage) return storageLanguage;
  }

  return "en";
}

export function useWgIssuesLanguage() {
  const [language, setLanguage] = useState<WgIssuesLanguage>(() =>
    readLanguageFromBrowser(),
  );

  useEffect(() => {
    const syncLanguage = () => {
      setLanguage(readLanguageFromBrowser());
    };

    syncLanguage();

    window.addEventListener("storage", syncLanguage);
    window.addEventListener("languagechange", syncLanguage);
    window.addEventListener("locale-change", syncLanguage);
    window.addEventListener("wg-language-change", syncLanguage);

    const observer = new MutationObserver(syncLanguage);

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

    const intervalId = window.setInterval(syncLanguage, 500);

    return () => {
      window.removeEventListener("storage", syncLanguage);
      window.removeEventListener("languagechange", syncLanguage);
      window.removeEventListener("locale-change", syncLanguage);
      window.removeEventListener("wg-language-change", syncLanguage);
      observer.disconnect();
      window.clearInterval(intervalId);
    };
  }, []);

  return language;
}
