import { cookies } from "next/headers";
import { locales, defaultLocale } from "@/i18n/config";

export async function getServerLocale(): Promise<string> {
  try {
    const cookieStore = await cookies();
    const locale = cookieStore.get("NEXT_LOCALE")?.value;
    return (locales as readonly string[]).includes(locale ?? "") ? locale! : defaultLocale;
  } catch {
    return defaultLocale;
  }
}

const NAMESPACES = [
  "common", "home", "category", "search", "article", "contact",
  "auth", "about", "careers", "corrections", "subscribe", "channel",
  "profile", "detail",
] as const;

export async function loadMessages(
  locale: string,
): Promise<Record<string, Record<string, unknown>>> {
  const results = await Promise.all(
    NAMESPACES.map(async (ns) => {
      try {
        const mod = await import(`../../../public/locales/${locale}/${ns}.json`);
        return mod.default as Record<string, unknown>;
      } catch {
        try {
          const fallback = await import(`../../../public/locales/en/${ns}.json`);
          return fallback.default as Record<string, unknown>;
        } catch {
          return {} as Record<string, unknown>;
        }
      }
    }),
  );
  return Object.fromEntries(
    NAMESPACES.map((ns, i) => [ns, results[i]]),
  ) as Record<string, Record<string, unknown>>;
}

function resolveKey(obj: unknown, key: string): string {
  const val = key.split(".").reduce((acc: unknown, k) => {
    if (acc && typeof acc === "object") return (acc as Record<string, unknown>)[k];
    return undefined;
  }, obj);
  return typeof val === "string" ? val : key;
}

export async function getServerT(
  locale: string,
  namespace: string,
): Promise<(key: string) => string> {
  try {
    const mod = await import(
      `../../../public/locales/${locale}/${namespace}.json`
    );
    const ns = mod.default as Record<string, unknown>;
    return (key: string) => resolveKey(ns, key);
  } catch {
    try {
      const fallback = await import(
        `../../../public/locales/en/${namespace}.json`
      );
      const ns = fallback.default as Record<string, unknown>;
      return (key: string) => resolveKey(ns, key);
    } catch {
      return (key: string) => key;
    }
  }
}
