import type { Locale } from "@/config/i18nRoutes";

/**
 * Replie l'alt traduit (`altTextEn` / `altTextEs`, postmeta exposés par
 * covalba-core) sur `altText` dans tout l'arbre de contenu WP, pour EN/ES.
 *
 * Pourquoi : Polylang ne traduit pas les médias (`media_support` off) → un seul
 * `altText` français partagé. On stocke les traductions en postmeta sur le même
 * média et on les substitue ici, AVANT que `mapImage` ne lise `altText`. Ainsi
 * aucun composant aval n'a besoin de connaître la locale pour l'alt.
 *
 * Mutation en place, profondeur arbitraire (sections ACF imbriquées). FR = no-op.
 */
export function localizeAltDeep<T>(node: T, locale: Locale, seen = new WeakSet<object>()): T {
  if (locale === "fr" || node === null || typeof node !== "object") return node;
  if (seen.has(node as object)) return node;
  seen.add(node as object);

  if (Array.isArray(node)) {
    for (const item of node) localizeAltDeep(item, locale, seen);
    return node;
  }

  const obj = node as Record<string, unknown>;
  // Node média : { sourceUrl, altText, altTextEn, altTextEs, ... }
  if ("altTextEn" in obj || "altTextEs" in obj) {
    const translated = obj[locale === "en" ? "altTextEn" : "altTextEs"];
    if (typeof translated === "string" && translated.trim() !== "") {
      obj.altText = translated;
    }
  }
  for (const key of Object.keys(obj)) {
    const value = obj[key];
    if (value && typeof value === "object") localizeAltDeep(value, locale, seen);
  }
  return node;
}
