// Helpers communs aux mappers de vues monolithiques (src/views/*).
// Les rows WP sont matchées par layout (suffixe du __typename), par `origine`
// si présent, ou par position parmi les sections du même layout.
// Valeur WP absente/null => undefined (le défaut de la vue prend le relais).

import type { WpSection } from "../types";

/** Toutes les sections dont le `__typename` se termine par `suffix` (ex. "HeroLayout"). */
export function byLayout<T extends WpSection>(
  sections: WpSection[] | null | undefined,
  suffix: string,
): T[] {
  return (sections ?? []).filter(
    (s): s is T => typeof s?.__typename === "string" && s.__typename.endsWith(suffix),
  );
}

/** N-ième section (par position) d'un layout donné, ou par `origine` si fournie. */
export function nthLayout<T extends WpSection>(
  sections: WpSection[] | null | undefined,
  suffix: string,
  nth = 0,
  origine?: string,
): T | undefined {
  const all = byLayout<T>(sections, suffix);
  if (origine) {
    const byOrigine = all.find((s) => s.origine === origine);
    if (byOrigine) return byOrigine;
  }
  return all[nth];
}

/** null/chaîne vide → undefined. */
export function u<T>(v: T | null | undefined): T | undefined {
  if (v === null || v === undefined) return undefined;
  if (typeof v === "string" && v === "") return undefined;
  return v;
}

/** Décode les entités HTML courantes des champs WP.
 * wptexturize encode l'apostrophe ASCII `'` en `&rsquo;`/`&#8217;` : on la
 * restitue en ASCII pour retrouver le littéral d'origine (les apostrophes
 * typographiques `’` saisies telles quelles ne sont pas encodées par WP). */
const decode = (s: string): string =>
  s
    .replace(/&nbsp;/g, " ")
    .replace(/&lt;/g, "<")
    .replace(/&gt;/g, ">")
    .replace(/&quot;/g, '"')
    .replace(/&#0?39;/g, "'")
    .replace(/&(?:rsquo|lsquo|#821[67]);/g, "'")
    .replace(/&(?:rdquo|ldquo|#822[01]);/g, '"')
    .replace(/&amp;/g, "&");

/** Texte brut d'un champ potentiellement HTML (wysiwyg) : balises retirées. */
export function stripHtml(html?: string | null): string | undefined {
  if (!html) return undefined;
  const t = decode(html.replace(/<[^>]+>/g, "")).trim();
  return t || undefined;
}

/** Titre plain-text : convention `*accent*` retirée (vues sans span de titre). */
export function plainTitle(titre?: string | null): string | undefined {
  if (!titre) return undefined;
  const t = titre.replace(/\*/g, "").trim();
  return t || undefined;
}
