"use client";

import {
  meetingSummaryText,
  meetingSummaryStatusLabels,
  type MeetingSummaryLanguage,
} from "./meeting-summary-i18n";
import {
  meetingSummaryOverrideFromDictionary,
  fetchMeetingSummaryDictionary,
  type MeetingSummaryTextOverride,
  type MeetingSummaryModule,
} from "../../ministry/meeting-summary/meeting-summary-translations";

// ---------------------------------------------------------------------------
// Types
// ---------------------------------------------------------------------------

type ApiTranslationItem = {
  id: number;
  translationKey: string;
  englishText: string;
  khmerText: string;
  module: string | null;
  page: string | null;
  isActive: boolean;
};


// Widen every leaf string literal in the static shape to plain `string`
// so the service can assign runtime API values without TS complaining about
// literal types (e.g. '"All Meeting Summary"' is not assignable to 'string').
type DeepMutable<T> = {
  -readonly [K in keyof T]: T[K] extends string
    ? string
    : T[K] extends object
      ? DeepMutable<T[K]>
      : T[K];
};

// The shape that all meeting-summary components consume.
export type MeetingSummaryTextShape = DeepMutable<
  (typeof meetingSummaryText)["en"]
>;

// Status labels per status key.
export type MeetingSummaryStatusLabelsShape = typeof meetingSummaryStatusLabels;


function pick(
  items: ApiTranslationItem[],
  key: string,
  lang: MeetingSummaryLanguage,
  fallback: string,
): string {
  const found = items.find((item) => item.translationKey === key);
  if (!found) return fallback;
  return lang === "kh"
    ? found.khmerText || fallback
    : found.englishText || fallback;
}

function buildTextShape(
  items: ApiTranslationItem[],
  lang: MeetingSummaryLanguage,
): MeetingSummaryTextShape {
  const s = meetingSummaryText[lang];

  function t(key: string, fallback: string) {
    return pick(items, key, lang, fallback);
  }

  function translateGroup<T extends Record<string, string>>(
    prefix: string,
    fallback: T,
  ): { [K in keyof T]: string } {
    return Object.fromEntries(
      Object.entries(fallback).map(([key, value]) => [
        key,
        t(
          `${prefix}.${key.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase()}`,
          value,
        ),
      ]),
    ) as { [K in keyof T]: string };
  }

  return {
    filterPanel: translateGroup("filter_panel", s.filterPanel),
    comment: translateGroup("comment", s.comment),
    gridLocale: translateGroup("grid_locale", s.gridLocale),
    listUi: translateGroup("list_ui", s.listUi),
    issueDialog: translateGroup("issue_dialog", s.issueDialog),
    common: translateGroup("common", s.common),
    upload: translateGroup("upload", s.upload),
    pageTitle: t("page_title", s.pageTitle),
    pageSubtitle: t("subtitle", s.pageSubtitle),

    previous: t("previous", s.previous),
    next: t("next", s.next),
    meetingRequestPager: t("meeting_request_pager", s.meetingRequestPager),
    viewDetail: t("view_detail", s.viewDetail),
    exportAsXlsx: t("export_as_xlsx", s.exportAsXlsx),
    exporting: t("exporting", s.exporting),

    details: {
      meetingRequest: t("details.meeting_request", s.details.meetingRequest),
      privateSectorWg: t(
        "details.private_sector_wg",
        s.details.privateSectorWg,
      ),
      meetingRequestDocument: t(
        "details.meeting_request_document",
        s.details.meetingRequestDocument,
      ),
      meetingDetails: t("details.meeting_details", s.details.meetingDetails),
      wgMeeting: t("details.wg_meeting", s.details.wgMeeting),
      meetingDocument: t("details.meeting_document", s.details.meetingDocument),
      governmentAgency: t(
        "details.government_agency",
        s.details.governmentAgency,
      ),
      sentBy: t("details.sent_by", s.details.sentBy),
      submittedDate: t("details.submitted_date", s.details.submittedDate),
      time: t("details.time", s.details.time),
      date: t("details.date", s.details.date),
      location: t("details.location", s.details.location),
      summaryReference: t(
        "details.summary_reference",
        s.details.summaryReference,
      ),
    },

    participants: {
      title: t("participants.title", s.participants.title),
      add: t("participants.add", s.participants.add),
      update: t("participants.update", s.participants.update),
      updatePswg: t("participants.update_pswg", s.participants.updatePswg),
      updateMinistry: t(
        "participants.update_ministry",
        s.participants.updateMinistry,
      ),
      pswgTitle: t("participants.pswg_title", s.participants.pswgTitle),
      ministryTitle: t(
        "participants.ministry_title",
        s.participants.ministryTitle,
      ),
      pswg: t("participants.pswg", s.participants.pswg),
      ministry: t("participants.ministry", s.participants.ministry),
      group: t("participants.group", s.participants.group),
      reporterName: t(
        "participants.reporter_name",
        s.participants.reporterName,
      ),
      reporterPosition: t(
        "participants.reporter_position",
        s.participants.reporterPosition,
      ),
      representativeName: t(
        "participants.representative_name",
        s.participants.representativeName,
      ),
      representativePosition: t(
        "participants.representative_position",
        s.participants.representativePosition,
      ),
      enterName: t("participants.enter_name", s.participants.enterName),
      enterPosition: t(
        "participants.enter_position",
        s.participants.enterPosition,
      ),
      enterReporterName: t(
        "participants.enter_reporter_name",
        s.participants.enterReporterName,
      ),
      enterReporterPosition: t(
        "participants.enter_reporter_position",
        s.participants.enterReporterPosition,
      ),
      enterRepresentativeName: t(
        "participants.enter_representative_name",
        s.participants.enterRepresentativeName,
      ),
      enterRepresentativePosition: t(
        "participants.enter_representative_position",
        s.participants.enterRepresentativePosition,
      ),
    },

    issueTable: {
      title: t("issue_table.title", s.issueTable.title),
      noIssues: t("issue_table.no_issues", s.issueTable.noIssues),
      wgName: t("issue_table.wg_name", s.issueTable.wgName),
      issue: t("issue_table.issue", s.issueTable.issue),
      category: t("issue_table.category", s.issueTable.category),
      description: t("issue_table.description", s.issueTable.description),
      recommendation: t(
        "issue_table.recommendation",
        s.issueTable.recommendation,
      ),
      rgcDecision: t("issue_table.rgc_decision", s.issueTable.rgcDecision),
      nextStep: t("issue_table.next_step", s.issueTable.nextStep),
      remark: t("issue_table.remark", s.issueTable.remark),
      issueReference: t(
        "issue_table.issue_reference",
        s.issueTable.issueReference,
      ),
      status: t("issue_table.status", s.issueTable.status),
      primaryAgency: t(
        "issue_table.primary_agency",
        s.issueTable.primaryAgency,
      ),
      secondAgency: t("issue_table.second_agency", s.issueTable.secondAgency),
      thirdAgency: t("issue_table.third_agency", s.issueTable.thirdAgency),
      fourthAgency: t("issue_table.fourth_agency", s.issueTable.fourthAgency),
      fifthAgency: t("issue_table.fifth_agency", s.issueTable.fifthAgency),
      escalation: t("issue_table.escalation", s.issueTable.escalation),
      action: t("issue_table.action", s.issueTable.action),
      viewDetail: t("issue_table.view_detail", s.issueTable.viewDetail),
      update: t("issue_table.update", s.issueTable.update),
    },

    issueComments: {
      openMenu: t("issue_comments.open_menu", s.issueComments.openMenu),
      viewDetail: t("issue_comments.view_detail", s.issueComments.viewDetail),
      addComment: t("issue_comments.add_comment", s.issueComments.addComment),
      editComment: t(
        "issue_comments.edit_comment",
        s.issueComments.editComment,
      ),
      deleteComment: t(
        "issue_comments.delete_comment",
        s.issueComments.deleteComment,
      ),
      viewComment: t(
        "issue_comments.view_comment",
        s.issueComments.viewComment,
      ),
      saved: t("issue_comments.saved", s.issueComments.saved),
      deleted: t("issue_comments.deleted", s.issueComments.deleted),
      saveFailed: t("issue_comments.save_failed", s.issueComments.saveFailed),
      typeRequired: t(
        "issue_comments.type_required",
        s.issueComments.typeRequired,
      ),
    },

    viewPage: {
      back: t("view_page.back", s.viewPage.back),
      title: t("view_page.title", s.viewPage.title),
      breadcrumbRoot: t("view_page.breadcrumb_root", s.viewPage.breadcrumbRoot),
      breadcrumbCurrent: t(
        "view_page.breadcrumb_current",
        s.viewPage.breadcrumbCurrent,
      ),
      loadError: t("view_page.load_error", s.viewPage.loadError),
      notFound: t("view_page.not_found", s.viewPage.notFound),
      returnToMinistry: t(
        "view_page.return_to_ministry",
        s.viewPage.returnToMinistry,
      ),
      returnConfirmDescription: t(
        "view_page.return_confirm_description",
        s.viewPage.returnConfirmDescription,
      ),
      returnConfirmLabel: t(
        "view_page.return_confirm_label",
        s.viewPage.returnConfirmLabel,
      ),
      review: t("view_page.review", s.viewPage.review),
      reviewed: t("view_page.reviewed", s.viewPage.reviewed),
      reviewConfirmTitle: t(
        "view_page.review_confirm_title",
        s.viewPage.reviewConfirmTitle,
      ),
      reviewConfirmDescription: t(
        "view_page.review_confirm_description",
        s.viewPage.reviewConfirmDescription,
      ),
      returnSuccess: t("view_page.return_success", s.viewPage.returnSuccess),
      returnFailed: t("view_page.return_failed", s.viewPage.returnFailed),
      returnReasonRequired: t(
        "view_page.return_reason_required",
        s.viewPage.returnReasonRequired,
      ),
      reviewSuccess: t("view_page.review_success", s.viewPage.reviewSuccess),
      confirmSummary: t("view_page.confirm_summary", s.viewPage.confirmSummary),
      confirmed: t("view_page.confirmed", s.viewPage.confirmed),
      confirmSummaryTitle: t(
        "view_page.confirm_summary_title",
        s.viewPage.confirmSummaryTitle,
      ),
      confirmSummaryDescription: t(
        "view_page.confirm_summary_description",
        s.viewPage.confirmSummaryDescription,
      ),
      confirmSummarySuccess: t(
        "view_page.confirm_summary_success",
        s.viewPage.confirmSummarySuccess,
      ),
      confirm: t("view_page.confirm", s.viewPage.confirm),
      cancel: t("view_page.cancel", s.viewPage.cancel),
    },

    filters: {
      status: t("filters.status", s.filters.status),
      year: t("filters.year", s.filters.year),
      issues: t("filters.issues", s.filters.issues),
    },

    columns: {
      id: t("columns.id", s.columns.id),
      summaryTitle: t("columns.summary_title", s.columns.summaryTitle),
      meetingDate: t("columns.meeting_date", s.columns.meetingDate),
      issueCount: t("columns.issue_count", s.columns.issueCount),
      meetingRequest: t("columns.meeting_request", s.columns.meetingRequest),
      meetingSummary: t("columns.meeting_summary", s.columns.meetingSummary),
      governmentAgency: t(
        "columns.government_agency",
        s.columns.governmentAgency,
      ),
      pswg: t("columns.pswg", s.columns.pswg),
      status: t("columns.status", s.columns.status),
      meetingPswg: t("columns.meeting_pswg", s.columns.meetingPswg),
      action: t("columns.action", s.columns.action),
    },
  };
}

function buildStatusLabels(
  items: ApiTranslationItem[],
  lang: MeetingSummaryLanguage,
): MeetingSummaryStatusLabelsShape {
  function t(key: string, fallback: string) {
    return pick(items, key, lang, fallback);
  }

  const base = meetingSummaryStatusLabels;

  return {
    DRAFT: {
      en: lang === "en" ? t("status.draft", base.DRAFT.en) : base.DRAFT.en,
      kh: lang === "kh" ? t("status.draft", base.DRAFT.kh) : base.DRAFT.kh,
    },
    SHARED: {
      en: lang === "en" ? t("status.shared", base.SHARED.en) : base.SHARED.en,
      kh: lang === "kh" ? t("status.shared", base.SHARED.kh) : base.SHARED.kh,
    },
    RETURNED: {
      en:
        lang === "en"
          ? t("status.returned", base.RETURNED.en)
          : base.RETURNED.en,
      kh:
        lang === "kh"
          ? t("status.returned", base.RETURNED.kh)
          : base.RETURNED.kh,
    },
    REVIEWED: {
      en:
        lang === "en"
          ? t("status.reviewed", base.REVIEWED.en)
          : base.REVIEWED.en,
      kh:
        lang === "kh"
          ? t("status.reviewed", base.REVIEWED.kh)
          : base.REVIEWED.kh,
    },
    CONFIRMED: {
      en:
        lang === "en"
          ? t("status.confirmed", base.CONFIRMED.en)
          : base.CONFIRMED.en,
      kh:
        lang === "kh"
          ? t("status.confirmed", base.CONFIRMED.kh)
          : base.CONFIRMED.kh,
    },
    SUBMITTED: {
      en:
        lang === "en"
          ? t("status.submitted", base.SUBMITTED.en)
          : base.SUBMITTED.en,
      kh:
        lang === "kh"
          ? t("status.submitted", base.SUBMITTED.kh)
          : base.SUBMITTED.kh,
    },
    COMPLETED: {
      en:
        lang === "en"
          ? t("status.completed", base.COMPLETED.en)
          : base.COMPLETED.en,
      kh:
        lang === "kh"
          ? t("status.completed", base.COMPLETED.kh)
          : base.COMPLETED.kh,
    },
  };
}

// ---------------------------------------------------------------------------
// Main export: fetch + merge with static fallback
// ---------------------------------------------------------------------------

export type MeetingSummaryTranslations = {
  text: MeetingSummaryTextShape;
  statusLabels: MeetingSummaryStatusLabelsShape;
  sharedTextOverride: MeetingSummaryTextOverride;
};

export async function fetchMeetingSummaryTranslations(
  lang: MeetingSummaryLanguage,
  module: MeetingSummaryModule = "pswg",
): Promise<MeetingSummaryTranslations> {
  try {
    const values = await fetchMeetingSummaryDictionary(lang === "kh" ? "km" : "en", undefined, module);
    const items: ApiTranslationItem[] = Object.entries(values).map(([translationKey, value], id) => ({
      id, translationKey, englishText: value, khmerText: value,
      module, page: "meeting_summary", isActive: true,
    }));
    const dictionary = Object.fromEntries(
      items.map((item) => [
        item.translationKey,
        lang === "kh" ? item.khmerText : item.englishText,
      ]),
    );
    // The PSWG list calls this column `id`; the shared Ministry tables use `no`.
    if (!dictionary["columns.no"] && dictionary["columns.id"]) {
      dictionary["columns.no"] = dictionary["columns.id"];
    }

    return {
      text: buildTextShape(items, lang),
      statusLabels: buildStatusLabels(items, lang),
      sharedTextOverride: meetingSummaryOverrideFromDictionary(dictionary),
    };
  } catch {
    // API unavailable – use static labels as fallback
    return {
      text: meetingSummaryText[lang],
      statusLabels: meetingSummaryStatusLabels,
      sharedTextOverride: {},
    };
  }
}
