"use client";

// Rendu des sections WordPress (flexible content `sections`).
// Frontière CLIENT : les composants d'origine (et leurs exports de défauts)
// sont des modules "use client" — les consommer depuis du code serveur en
// ferait des références client inertes. Le renderer reçoit les sections en
// JSON sérialisable depuis les routes serveur, comme la SPA d'origine. Priorité au registry `origine` : chaque section seedée
// porte le nom du composant React d'ORIGINE du site (parité pixel avec la
// version pré-CMS) — l'adaptateur mappe les données WP vers les props du
// composant original. Fallback : block générique matché sur le suffixe
// `...XxxLayout` du `__typename` (sections ajoutées dans le BO sans origine).

import type { ComponentType } from "react";
import type { WpSection } from "@/lib/wp/types";
import type { Locale } from "@/config/i18nRoutes";
import { origineRegistry } from "@/components/origine";
import { AccentColorContext } from "./accentContext";
import { LocaleContext } from "./localeContext";
import { LatestPostsContext, type LatestPostCard } from "./latestPostsContext";

import Hero from "./Hero";
import BarreReassurance from "./BarreReassurance";
import GrilleCards from "./GrilleCards";
import TexteImage from "./TexteImage";
import Chiffres from "./Chiffres";
import TableauComparatif from "./TableauComparatif";
import TableauSituations from "./TableauSituations";
import Etapes from "./Etapes";
import Faq from "./Faq";
import Cta from "./Cta";
import TemoignagesVideo from "./TemoignagesVideo";
import Video from "./Video";
import Logos from "./Logos";
import Citation from "./Citation";
import ContenuSeo from "./ContenuSeo";
import CompatibiliteSupports from "./CompatibiliteSupports";
import GrilleSecteurs from "./GrilleSecteurs";
import GrilleSolutions from "./GrilleSolutions";
import ReferencesGrille from "./ReferencesGrille";
import Timeline from "./Timeline";
import ComposantReact from "./ComposantReact";
import SpecsTechniques from "./SpecsTechniques";
import Certifications from "./Certifications";
import VariantesProduit from "./VariantesProduit";
import AvantApres from "./AvantApres";
import FicheChantier from "./FicheChantier";
import BeneficesMesurables from "./BeneficesMesurables";
import PreuveChiffres from "./PreuveChiffres";
import CtaFinalSimple from "./CtaFinalSimple";
import CtaFinalEnrichi from "./CtaFinalEnrichi";
import Expertise from "./Expertise";
import LogosPresse from "./LogosPresse";
import AvantagesProduit from "./AvantagesProduit";
import Constat from "@/components/blocks/Constat";
import CoolRoofExplainer from "@/components/blocks/CoolRoofExplainer";
import Applicateurs from "@/components/blocks/Applicateurs";
import GrilleFrictions from "@/components/blocks/GrilleFrictions";
import PrincipeCoolRoof from "@/components/blocks/PrincipeCoolRoof";
import SystemeCouches from "@/components/blocks/SystemeCouches";
import ProduitShowcase from "@/components/blocks/ProduitShowcase";
import DuelComparatif from "@/components/blocks/DuelComparatif";
import PrimeCee from "@/components/blocks/PrimeCee";
import WinterObjection from "@/components/blocks/WinterObjection";
import RseSection from "@/components/blocks/RseSection";
import ProductHero from "@/components/blocks/ProductHero";
import IndustrieHero from "@/components/blocks/IndustrieHero";
import SecteurHero from "@/components/blocks/SecteurHero";
import LocalHero from "@/components/blocks/LocalHero";
import RoofHero from "@/components/blocks/RoofHero";

// Les blocs WP ont des props différentes ; le registre dynamique est resserré au point de rendu.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const registry: Record<string, ComponentType<any>> = {
  HeroLayout: Hero,
  BarreReassuranceLayout: BarreReassurance,
  GrilleCardsLayout: GrilleCards,
  TexteImageLayout: TexteImage,
  ChiffresLayout: Chiffres,
  TableauComparatifLayout: TableauComparatif,
  TableauSituationsLayout: TableauSituations,
  EtapesLayout: Etapes,
  FaqLayout: Faq,
  CtaLayout: Cta,
  TemoignagesVideoLayout: TemoignagesVideo,
  VideoLayout: Video,
  LogosLayout: Logos,
  CitationLayout: Citation,
  ContenuSeoLayout: ContenuSeo,
  CompatibiliteSupportsLayout: CompatibiliteSupports,
  GrilleSecteursLayout: GrilleSecteurs,
  GrilleSolutionsLayout: GrilleSolutions,
  ReferencesGrilleLayout: ReferencesGrille,
  TimelineLayout: Timeline,
  ComposantReactLayout: ComposantReact,
  SpecsTechniquesLayout: SpecsTechniques,
  CertificationsLayout: Certifications,
  VariantesProduitLayout: VariantesProduit,
  AvantApresLayout: AvantApres,
  FicheChantierLayout: FicheChantier,
  BeneficesMesurablesLayout: BeneficesMesurables,
  PreuveChiffresLayout: PreuveChiffres,
  CtaFinalSimpleLayout: CtaFinalSimple,
  CtaFinalEnrichiLayout: CtaFinalEnrichi,
  ExpertiseLayout: Expertise,
  LogosPresseLayout: LogosPresse,
  AvantagesProduitLayout: AvantagesProduit,
  ConstatLayout: Constat,
  CoolRoofExplainerLayout: CoolRoofExplainer,
  ApplicateursLayout: Applicateurs,
  GrilleFrictionsLayout: GrilleFrictions,
  PrincipeCoolRoofLayout: PrincipeCoolRoof,
  SystemeCouchesLayout: SystemeCouches,
  ProduitShowcaseLayout: ProduitShowcase,
  DuelComparatifLayout: DuelComparatif,
  PrimeCeeLayout: PrimeCee,
  WinterObjectionLayout: WinterObjection,
  RseSectionLayout: RseSection,
  ProductHeroLayout: ProductHero,
  IndustrieHeroLayout: IndustrieHero,
  SecteurHeroLayout: SecteurHero,
  LocalHeroLayout: LocalHero,
  RoofHeroLayout: RoofHero,
};

// Tri par longueur décroissante : `TemoignagesVideoLayout` doit matcher avant
// `VideoLayout` (les deux sont des suffixes valides du même __typename).
const registryKeys = Object.keys(registry).sort((a, b) => b.length - a.length);

export function BlockRenderer({
  sections,
  accentColor = null,
  latestPosts = null,
  locale = "fr",
}: {
  sections: WpSection[] | null | undefined;
  /** Couleur d'accent du contenu (ex. produit) propagée aux composants d'origine. */
  accentColor?: string | null;
  /** Derniers articles de blog (section ressources de la home). */
  latestPosts?: LatestPostCard[] | null;
  /** Locale du contenu (EN/ES) → variante de langue des composants de bloc. Défaut "fr". */
  locale?: Locale;
}) {
  if (!sections?.length) return null;

  return (
    <LocaleContext.Provider value={locale}>
    <LatestPostsContext.Provider value={latestPosts}>
    <AccentColorContext.Provider value={accentColor}>
      {sections.map((section, i) => {
        const typename = section?.__typename;
        if (!typename) return null;

        // 1) Composant d'origine du site (parité pixel) — un adaptateur par
        //    valeur d'`origine`, qui rend le composant original paramétré.
        //    Sentinel "_absorbe" : row dont les données sont consommées par
        //    l'adaptateur d'une row voisine (composants 1-pour-N) — pas de rendu.
        const origine = section.origine;
        if (origine === "_absorbe") return null;
        if (origine && origineRegistry[origine]) {
          const Original = origineRegistry[origine];
          return <Original key={i} {...section} position={i} />;
        }
        if (origine && process.env.NODE_ENV !== "production") {
          console.warn(
            `[BlockRenderer] origine "${origine}" sans adaptateur — fallback générique`,
          );
        }

        // 2) Fallback générique par layout.
        const key = registryKeys.find((k) => typename.endsWith(k));
        if (!key) {
          if (process.env.NODE_ENV !== "production") {
            console.warn(`[BlockRenderer] Layout inconnu : ${typename}`);
          }
          return null;
        }

        const Block = registry[key];
        return <Block key={i} {...section} position={i} />;
      })}
    </AccentColorContext.Provider>
    </LatestPostsContext.Provider>
    </LocaleContext.Provider>
  );
}

export default BlockRenderer;
