// Mapper de la vue monolithique src/views/DevenirApplicateur.tsx.
// Rows WP de page--devenir-applicateur : hero (badge = badges[0]), video,
// 2 grille_cards (pourquoi / partenariat — par position), composant_react
// `applicateur_screener` + `formulaire_hubspot`, etapes (parcours),
// texte_image (implantation), temoignages_video, faq, cta final, contenu_seo.
// Icônes reprises de l'original par position ; valeur absente => undefined.
// Le titre "partenariat" conserve la convention `*accent*` (parseAccent côté vue).

import {
  BadgeCheck,
  BriefcaseBusiness,
  ClipboardCheck,
  GraduationCap,
  PackageCheck,
  Settings,
  ShieldCheck,
  SprayCan,
  Store,
  Wrench,
} from "lucide-react";
import { arr, mapImage } from "../mappers";
import type {
  ComposantReactBlock,
  ContenuSeoBlock,
  CtaBlock,
  EtapesBlock,
  FaqBlock,
  GrilleCardsBlock,
  HeroBlock,
  TemoignagesVideoBlock,
  TexteImageBlock,
  VideoBlock,
  WpSection,
} from "../types";
import type {
  ApplicateurFaqItem,
  ApplicateurSeoBloc,
  DevenirApplicateurProps,
  JourneyStep,
  PartnerOffer,
  PourquoiCard,
} from "@/views/DevenirApplicateur";
import { byLayout, nthLayout, plainTitle, stripHtml, u } from "./shared";
import { mapHubspotFormConfig } from "./hubspot";

/** Icônes des cards "pourquoi le cool roof" de l'original, par position. */
const POURQUOI_ICONS = [ShieldCheck, BriefcaseBusiness];

/** Icônes des cards "partenariat" de l'original, par position. */
const OFFER_ICONS = [SprayCan, Wrench, GraduationCap, Settings, Store, BadgeCheck];

/** Icônes des étapes du parcours de l'original, par position. */
const JOURNEY_ICONS = [ClipboardCheck, GraduationCap, Wrench, PackageCheck];

export function mapDevenirApplicateurProps(sections: WpSection[]): DevenirApplicateurProps {
  const hero = nthLayout<HeroBlock>(sections, "HeroLayout");
  const video = nthLayout<VideoBlock>(sections, "VideoLayout");
  const grilles = byLayout<GrilleCardsBlock>(sections, "GrilleCardsLayout");
  const [pourquoi, partenariat] = grilles;
  const composants = byLayout<ComposantReactBlock>(sections, "ComposantReactLayout");
  const screener = composants.find((c) => c.composant === "applicateur_screener");
  const formulaire = composants.find((c) => c.composant === "formulaire_hubspot");
  const etapes = nthLayout<EtapesBlock>(sections, "EtapesLayout");
  const implantation = nthLayout<TexteImageBlock>(sections, "TexteImageLayout");
  const temoignages = nthLayout<TemoignagesVideoBlock>(sections, "TemoignagesVideoLayout");
  const faq = nthLayout<FaqBlock>(sections, "FaqLayout");
  const cta = nthLayout<CtaBlock>(sections, "CtaLayout");
  const contenuSeo = nthLayout<ContenuSeoBlock>(sections, "ContenuSeoLayout");

  const heroImage = mapImage(hero?.image);
  const implImage = mapImage(implantation?.image);

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

  const offerCardsWp = arr(partenariat?.cards);
  const partnerOffers: PartnerOffer[] | undefined = offerCardsWp.length
    ? offerCardsWp.map((card, i) => ({
        icon: OFFER_ICONS[i] ?? SprayCan,
        title: plainTitle(card?.titre) ?? "",
        text: stripHtml(card?.texte) ?? "",
        image: mapImage(card?.image)?.sourceUrl ?? "",
      }))
    : undefined;

  const etapesWp = arr(etapes?.etapes);
  const journeySteps: JourneyStep[] | undefined = etapesWp.length
    ? etapesWp.map((etape, i) => ({
        num: String(i + 1).padStart(2, "0"),
        icon: JOURNEY_ICONS[i] ?? ClipboardCheck,
        title: plainTitle(etape?.titre) ?? "",
        text: stripHtml(etape?.texte) ?? "",
      }))
    : undefined;

  const implantationsWp = arr(implantation?.liste)
    .map((item) => item?.texte ?? "")
    .filter(Boolean);

  // Témoignage : `contexte` = "Label : item, item, item." → label + puces.
  const temoignage = arr(temoignages?.temoignages)[0];
  const contexte = stripHtml(temoignage?.contexte);
  let temLabel: string | undefined;
  let temItems: string[] | undefined;
  if (contexte) {
    const sep = contexte.indexOf(" : ");
    if (sep >= 0) {
      temLabel = contexte.slice(0, sep);
      const items = contexte
        .slice(sep + 3)
        .replace(/\.$/, "")
        .split(", ")
        .map((item) => item.trim())
        .filter(Boolean);
      temItems = items.length ? items : undefined;
    }
  }

  const questions = arr(faq?.questions);
  const faqs: ApplicateurFaqItem[] | undefined = questions.length
    ? questions.map((q) => ({
        q: q?.question ?? "",
        a: stripHtml(q?.reponse) ?? "",
      }))
    : undefined;

  const seoSections = arr(contenuSeo?.sections);
  const seoBlocs: ApplicateurSeoBloc[] | undefined = seoSections.length
    ? seoSections.map((s) => ({
        titre: plainTitle(s?.titre) ?? "",
        texte: stripHtml(s?.contenu) ?? "",
      }))
    : undefined;

  return {
    heroEyebrow: u(hero?.eyebrow),
    heroBadge: u(arr(hero?.badges)[0]?.texte),
    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),
    videoTitre: plainTitle(video?.entete?.titre),
    videoUrl: u(video?.videoUrl),
    pourquoiBadge: u(pourquoi?.entete?.badge),
    pourquoiTitre: plainTitle(pourquoi?.entete?.titre),
    pourquoiIntro: stripHtml(pourquoi?.entete?.intro),
    pourquoiCards,
    partBadge: u(partenariat?.entete?.badge),
    partTitre: u(partenariat?.entete?.titre),
    partIntro: stripHtml(partenariat?.entete?.intro),
    partnerOffers,
    screenerTitre: u(screener?.titre),
    formTitre: u(formulaire?.titre),
    formId: u(formulaire?.hubspotFormId),
    hubspotForm: mapHubspotFormConfig(formulaire?.formulaireHubspot, formulaire?.hubspotFormId),
    parcoursBadge: u(etapes?.entete?.badge),
    parcoursTitre: plainTitle(etapes?.entete?.titre),
    journeySteps,
    implTitre: plainTitle(implantation?.entete?.titre),
    implTexte: stripHtml(implantation?.contenu),
    implantations: implantationsWp.length ? implantationsWp : undefined,
    implImage: implImage?.sourceUrl,
    implImageAlt: u(implImage?.altText),
    temTitre: plainTitle(temoignages?.entete?.titre),
    temIntro: stripHtml(temoignages?.entete?.intro),
    temVideoUrl: u(temoignage?.videoUrl),
    temLabel,
    temItems,
    faqBadge: u(faq?.entete?.badge),
    faqTitre: plainTitle(faq?.entete?.titre),
    faqs,
    ctaTitre: plainTitle(cta?.titre),
    ctaTexte: stripHtml(cta?.texte),
    ctaLabel: u(cta?.ctaPrimaire?.label),
    ctaHref: u(cta?.ctaPrimaire?.lien),
    seoTitre: stripHtml(contenuSeo?.intro),
    seoBlocs,
  };
}
