import {
  i18n,
  type UiLang,
  type MinistryMeetingRequestText,
} from "./meeting-request-i18n";
import type { DashboardModule } from "../../cdc-gpsf/dashboard/dashboard-translations";

export function meetingTranslationPage(pathname: string) {
  return pathname.split("/")[2] === "meeting-calendar"
    ? "meeting_calendar" as const
    : "meeting_requests" as const;
}

export function ministryMeetingRequestKey(path: string): string {
  if (path === "title") return "page_title";
  return path
    .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
    .replace(/ /g, "_")
    .toLowerCase();
}

export function resolveMinistryMeetingRequestText(
  language: UiLang,
  dictionary: Record<string, string>,
): MinistryMeetingRequestText {
  function visit(value: object, prefix = ""): object {
    return Object.fromEntries(
      Object.entries(value).map(([key, fallback]) => {
        const path = prefix ? prefix + "." + key : key;
        const translated = dictionary[ministryMeetingRequestKey(path)];
        return [
          key,
          typeof fallback === "string"
            ? typeof translated === "string" && translated.trim()
              ? translated
              : fallback
            : visit(fallback, path),
        ];
      }),
    );
  }
  return visit(i18n[language]) as MinistryMeetingRequestText;
}

export async function fetchMinistryMeetingRequestDictionary(
  language: UiLang,
  signal?: AbortSignal,
  owner: DashboardModule = "ministry",
  page: "meeting_requests" | "meeting_calendar" = "meeting_requests",
): Promise<Record<string, string>> {
  const base = (
    process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001/api/v1"
  ).replace(/\/$/, "");
  const query = new URLSearchParams({
    module: owner,
    page,
    language,
  });
  const response = await fetch(base + "/translations/dictionary?" + query, {
    credentials: "include",
    cache: "no-store",
    signal,
  });
  if (!response.ok)
    throw new Error("Could not load Ministry meeting request translations");
  let value: unknown = await response.json();
  for (
    let depth = 0;
    depth < 5 && value && typeof value === "object";
    depth++
  ) {
    const record = value as Record<string, unknown>;
    if (record.translations && typeof record.translations === "object") {
      return Object.fromEntries(
        Object.entries(record.translations).filter(
          (entry): entry is [string, string] =>
            typeof entry[1] === "string" && !!entry[1].trim(),
        ),
      );
    }
    value = record.data;
  }
  return {};
}
