// Mapper de la vue monolithique src/views/QuiSommesNous.tsx.
// Rows WP de page--qui-sommes-nous : hero, texte_image "mission", chiffres,
// logos custom (presse), texte_image "aventure" (note = légende + badge date),
// 4 grille_cards (coulisses, galerie, pourquoi, valeurs — par position),
// temoignages_video, timeline, cta final. Icônes et eyebrows des cards repris
// de l'original par position ; valeur absente => undefined.

import {
  BadgeCheck,
  Building2,
  Factory,
  HeartHandshake,
  Lightbulb,
  Medal,
  ShieldCheck,
  Sparkles,
} from "lucide-react";
import { arr, mapImage } from "../mappers";
import type {
  ChiffresBlock,
  CtaBlock,
  GrilleCardsBlock,
  HeroBlock,
  LogosBlock,
  TemoignagesVideoBlock,
  TexteImageBlock,
  TimelineBlock,
  WpSection,
} from "../types";
import type {
  BehindScene,
  CompanyGalleryItem,
  Difference,
  PressLogo,
  QuiSommesNousProps,
  Stat,
  TimelineItem,
  ValueCard,
  VideoItem,
} from "@/views/QuiSommesNous";
import { byLayout, nthLayout, plainTitle, stripHtml, u } from "./shared";

/** Eyebrows des cards "coulisses" de l'original, par position. */
const BEHIND_EYEBROWS = ["Les fondateurs", "Le diagnostic", "L'application en sécurité"];

/** Icônes des cards "pourquoi Covalba" de l'original, par position. */
const DIFFERENCE_ICONS = [Factory, Medal, Building2, ShieldCheck];

/** Icônes des cards "valeurs" de l'original, par position. */
const VALUE_ICONS = [BadgeCheck, Lightbulb, Sparkles, HeartHandshake];

/** Découpe les <p> d'un wysiwyg en paragraphes plain-text. */
const paragraphs = (html?: string | null): string[] | undefined => {
  if (!html) return undefined;
  const parts = html
    .split(/<\/p>/i)
    .map((part) => stripHtml(part) ?? "")
    .filter(Boolean);
  return parts.length ? parts : undefined;
};

/**
 * Découpe la note WP "Maxime et Bertrand, les fondateurs de Covalba. Depuis 2011."
 * en légende + badge date (les deux spans du figcaption de l'original).
 */
const splitNote = (
  note?: string | null,
): { legende?: string; badgeDate?: string } => {
  const texte = stripHtml(note);
  if (!texte) return {};
  const match = texte.match(/^(.*\.)\s+(.+?)\.?$/);
  if (!match) return { legende: texte };
  return { legende: match[1], badgeDate: match[2] };
};

export function mapQuiSommesNousProps(sections: WpSection[]): QuiSommesNousProps {
  const hero = nthLayout<HeroBlock>(sections, "HeroLayout");
  const textesImages = byLayout<TexteImageBlock>(sections, "TexteImageLayout");
  const [mission, aventure] = textesImages;
  const chiffres = nthLayout<ChiffresBlock>(sections, "ChiffresLayout");
  const logos = nthLayout<LogosBlock>(sections, "LogosLayout");
  const grilles = byLayout<GrilleCardsBlock>(sections, "GrilleCardsLayout");
  const [coulisses, galerie, pourquoi, valeurs] = grilles;
  const temoignages = nthLayout<TemoignagesVideoBlock>(sections, "TemoignagesVideoLayout");
  const frise = nthLayout<TimelineBlock>(sections, "TimelineLayout");
  const cta = nthLayout<CtaBlock>(sections, "CtaLayout");

  const heroImage = mapImage(hero?.image);
  const missionImage = mapImage(mission?.image);
  const aventureImage = mapImage(aventure?.image);

  const figures = arr(chiffres?.figures);
  const stats: Stat[] | undefined = figures.length
    ? figures.map((f) => ({ value: f?.value ?? "", label: f?.label ?? "" }))
    : undefined;

  const logosCustom = arr(logos?.logosCustom);
  const pressLogos: PressLogo[] | undefined = logosCustom.length
    ? logosCustom.map((l) => {
        const image = mapImage(l?.image);
        return {
          name: l?.nom ?? image?.altText ?? "",
          src: image?.sourceUrl ?? "",
        };
      })
    : undefined;

  const note = splitNote(aventure?.note);

  const coulissesCards = arr(coulisses?.cards);
  const behindScenes: BehindScene[] | undefined = coulissesCards.length
    ? coulissesCards.map((card, i) => {
        const image = mapImage(card?.image);
        return {
          eyebrow: BEHIND_EYEBROWS[i] ?? "",
          title: plainTitle(card?.titre) ?? "",
          text: stripHtml(card?.texte) ?? "",
          image: image?.sourceUrl ?? "",
          imageAlt: image?.altText ?? "",
        };
      })
    : undefined;

  const galerieCards = arr(galerie?.cards);
  const companyGallery: CompanyGalleryItem[] | undefined = galerieCards.length
    ? galerieCards.map((card) => {
        const image = mapImage(card?.image);
        return {
          title: plainTitle(card?.titre) ?? "",
          image: image?.sourceUrl ?? "",
          imageAlt: image?.altText ?? "",
        };
      })
    : undefined;

  const temoignagesItems = arr(temoignages?.temoignages);
  const videos: VideoItem[] | undefined = temoignagesItems.length
    ? temoignagesItems.map((t) => ({
        title: t?.contexte ?? "",
        src: t?.videoUrl ?? "",
      }))
    : undefined;

  const jalons = arr(frise?.jalons);
  const timeline: TimelineItem[] | undefined = jalons.length
    ? jalons.map((jalon) => {
        const image = mapImage(jalon?.image);
        return {
          year: jalon?.annee ?? "",
          title: plainTitle(jalon?.titre) ?? "",
          text: stripHtml(jalon?.texte) ?? "",
          image: image?.sourceUrl ?? "",
          imageAlt: image?.altText ?? "",
        };
      })
    : undefined;

  const pourquoiCards = arr(pourquoi?.cards);
  const differences: Difference[] | undefined = pourquoiCards.length
    ? pourquoiCards.map((card, i) => ({
        icon: DIFFERENCE_ICONS[i] ?? Factory,
        title: plainTitle(card?.titre) ?? "",
        text: stripHtml(card?.texte) ?? "",
      }))
    : undefined;

  const valeursCards = arr(valeurs?.cards);
  const values: ValueCard[] | undefined = valeursCards.length
    ? valeursCards.map((card, i) => ({
        icon: VALUE_ICONS[i] ?? BadgeCheck,
        title: plainTitle(card?.titre) ?? "",
        text: stripHtml(card?.texte) ?? "",
      }))
    : undefined;

  return {
    heroEyebrow: u(hero?.eyebrow),
    heroTitre: plainTitle(hero?.titre),
    heroIntro: stripHtml(hero?.lead),
    heroImage: heroImage?.sourceUrl,
    heroImageAlt: u(heroImage?.altText),
    heroCtaLabel: u(hero?.ctaPrimaire?.label),
    heroCtaHref: u(hero?.ctaPrimaire?.lien),
    heroSecondaireLabel: u(hero?.ctaSecondaire?.label),
    heroSecondaireHref: u(hero?.ctaSecondaire?.lien),
    missionBadge: u(mission?.entete?.badge),
    missionTitre: plainTitle(mission?.entete?.titre),
    missionTexte: stripHtml(mission?.contenu),
    missionImage: missionImage?.sourceUrl,
    missionImageAlt: u(missionImage?.altText),
    stats,
    pressLabel: u(logos?.entete?.badge),
    pressLogos,
    aventureBadge: u(aventure?.entete?.badge),
    aventureTitre: plainTitle(aventure?.entete?.titre),
    aventureParagraphes: paragraphs(aventure?.contenu),
    aventureImage: aventureImage?.sourceUrl,
    aventureImageAlt: u(aventureImage?.altText),
    aventureLegende: note.legende,
    aventureBadgeDate: note.badgeDate,
    aventureCtaLabel: u(aventure?.cta?.label),
    aventureCtaHref: u(aventure?.cta?.lien),
    coulissesBadge: u(coulisses?.entete?.badge),
    coulissesTitre: plainTitle(coulisses?.entete?.titre),
    behindScenes,
    galerieBadge: u(galerie?.entete?.badge),
    galerieTitre: plainTitle(galerie?.entete?.titre),
    companyGallery,
    videosBadge: u(temoignages?.entete?.badge),
    videosTitre: plainTitle(temoignages?.entete?.titre),
    videos,
    timelineBadge: u(frise?.entete?.badge),
    timelineTitre: plainTitle(frise?.entete?.titre),
    timeline,
    pourquoiBadge: u(pourquoi?.entete?.badge),
    pourquoiTitre: plainTitle(pourquoi?.entete?.titre),
    pourquoiIntro: stripHtml(pourquoi?.entete?.intro),
    differences,
    valeursTitre: plainTitle(valeurs?.entete?.titre),
    valeursIntro: stripHtml(valeurs?.entete?.intro),
    values,
    ctaTitre: plainTitle(cta?.titre),
    ctaTexte: stripHtml(cta?.texte),
    ctaLabel: u(cta?.ctaPrimaire?.label),
    ctaHref: u(cta?.ctaPrimaire?.lien),
    ctaSecondaireLabel: u(cta?.ctaSecondaire?.label),
    ctaSecondaireHref: u(cta?.ctaSecondaire?.lien),
  };
}
