// Mapper de la vue monolithique src/views/Contact.tsx.
// Retrouve chaque donnée dans les rows WP de page--contact (hero, formulaire
// HubSpot, 3 grilles de cards, logos custom, carte) ; toute valeur absente
// reste undefined → le défaut du composant original prend le relais.

import { Linkedin, Mail, MapPin, Phone, Share2, Youtube } from "lucide-react";
import { arr, mapImage } from "../mappers";
import type {
  ComposantReactBlock,
  GrilleCardsBlock,
  HeroBlock,
  LogosBlock,
  WpSection,
} from "../types";
import type {
  ContactMethod,
  ContactPresenceZone,
  ContactProps,
  ContactSocialLink,
  ContactTrustLogo,
} from "@/views/Contact";
import { byLayout, nthLayout, plainTitle, stripHtml, u } from "./shared";
import { mapHubspotFormConfig } from "./hubspot";

/** Icônes des cartes "moyens de contact", par position (parité avec l'original). */
const METHOD_ICONS = [Phone, Mail, MapPin];

/** Icône d'un réseau social d'après son nom (parité avec l'original). */
const socialIcon = (name: string) => {
  const n = name.toLowerCase();
  if (n.includes("linkedin")) return Linkedin;
  if (n.includes("youtube")) return Youtube;
  return Share2;
};

export function mapContactProps(sections: WpSection[]): ContactProps {
  const hero = nthLayout<HeroBlock>(sections, "HeroLayout");
  const composants = byLayout<ComposantReactBlock>(sections, "ComposantReactLayout");
  const formulaire = composants.find((c) => c.composant === "formulaire_hubspot");
  const carte = composants.find((c) => c.composant === "carte_intervention");
  const logos = nthLayout<LogosBlock>(sections, "LogosLayout");

  // 3 grilles de cards, par position : moyens de contact, zones de présence, réseaux.
  const grilles = byLayout<GrilleCardsBlock>(sections, "GrilleCardsLayout");
  const [methodsGrid, coordGrid, sociauxGrid] = grilles;

  // Cards avec lien = moyens de contact ; card sans lien = encart "Pour aller plus vite".
  const methodCards = arr(methodsGrid?.cards).filter((c) => u(c?.lien));
  const quickCard = arr(methodsGrid?.cards).find((c) => !u(c?.lien));

  const contactMethods: ContactMethod[] | undefined = methodCards.length
    ? methodCards.map((c, i) => ({
        icon: METHOD_ICONS[i] ?? Phone,
        label: plainTitle(c.titre) ?? "",
        value: stripHtml(c.texte) ?? "",
        href: c.lien ?? "",
      }))
    : undefined;

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

  // Zones de présence : texte WP "detail — places" redécoupé comme l'original.
  const coordCards = arr(coordGrid?.cards);
  const presenceZones: ContactPresenceZone[] | undefined = coordCards.length
    ? coordCards.map((c) => {
        const [detail, ...places] = (stripHtml(c?.texte) ?? "").split(" — ");
        return {
          area: plainTitle(c?.titre) ?? "",
          detail: detail ?? "",
          places: places.join(" — "),
        };
      })
    : undefined;

  const sociauxCards = arr(sociauxGrid?.cards);
  const socialLinks: ContactSocialLink[] | undefined = sociauxCards.length
    ? sociauxCards.map((c) => ({
        name: plainTitle(c?.titre) ?? "",
        href: c?.lien ?? "",
        icon: socialIcon(c?.titre ?? ""),
      }))
    : undefined;

  return {
    badge: u(hero?.eyebrow),
    titre: plainTitle(hero?.titre),
    intro: stripHtml(hero?.lead),
    formulaireTitre: u(formulaire?.titre),
    hubspotFormId: u(formulaire?.hubspotFormId),
    hubspotForm: mapHubspotFormConfig(formulaire?.formulaireHubspot, formulaire?.hubspotFormId),
    contactMethods,
    quickTitle: plainTitle(quickCard?.titre),
    quickText: stripHtml(quickCard?.texte),
    logosLabel: u(logos?.entete?.badge),
    logosTitre: plainTitle(logos?.entete?.titre),
    trustLogos,
    coordBadge: u(coordGrid?.entete?.badge),
    coordTitre: plainTitle(coordGrid?.entete?.titre),
    coordIntro: stripHtml(coordGrid?.entete?.intro),
    presenceZones,
    carteTitre: u(carte?.titre),
    sociauxBadge: u(sociauxGrid?.entete?.badge),
    sociauxTitre: plainTitle(sociauxGrid?.entete?.titre),
    sociauxIntro: stripHtml(sociauxGrid?.entete?.intro),
    socialLinks,
  };
}
