import type { Block } from "@/lib/blocks/schema";
import { CardGridBlock, CtaBlock, FaqBlock, GalleryBlock, HeroBlock, RichTextBlock, StatsBlock, TestimonialsBlock, TextImageBlock, VideoBlock } from "./static-blocks";
import { ContentListBlock, PeopleListBlock, SessionScheduleBlock } from "./data-blocks";
import { FormBlock } from "./form-block";
import { ButtonRowBlock, CarouselBlock, ContactBlock, CountdownBlock, DownloadsBlock, EmbedBlock, LogoGridBlock, MapBlock, NewsletterBlock, SocialFeedBlock, SocialLinksBlock, SpacerBlock, TabsBlock, TicketBannerBlock, VenueInfoBlock } from "./extra-blocks";
import type { RenderContext } from "./types";

function RenderOne({ block, ctx, first }: { block: Block; ctx: RenderContext; first: boolean }) {
  switch (block.type) {
    case "richText": return <RichTextBlock block={block} vars={ctx.vars} />;
    case "hero": return <HeroBlock block={block} media={ctx.media} first={first} />;
    case "textImage": return <TextImageBlock block={block} media={ctx.media} />;
    case "gallery": return <GalleryBlock block={block} media={ctx.media} />;
    case "cardGrid": return <CardGridBlock block={block} media={ctx.media} />;
    case "stats": return <StatsBlock block={block} />;
    case "testimonials": return <TestimonialsBlock block={block} />;
    case "faq": return <FaqBlock block={block} />;
    case "video": return <VideoBlock block={block} />;
    case "cta": return <CtaBlock block={block} />;
    case "form": return <FormBlock block={block} ctx={ctx} />;
    case "contentList": return <ContentListBlock block={block} ctx={ctx} />;
    case "speakerList":
    case "exhibitorList": return <PeopleListBlock block={block} ctx={ctx} />;
    case "sessionSchedule": return <SessionScheduleBlock block={block} ctx={ctx} />;
    case "countdown": return <CountdownBlock block={block} />;
    case "logoGrid": return <LogoGridBlock block={block} ctx={ctx} />;
    case "buttonRow": return <ButtonRowBlock block={block} />;
    case "carousel": return <CarouselBlock block={block} ctx={ctx} />;
    case "tabs": return <TabsBlock block={block} vars={ctx.vars} />;
    case "spacer": return <SpacerBlock block={block} />;
    case "embed": return <EmbedBlock block={block} />;
    case "map": return <MapBlock block={block} />;
    case "socialFeed": return <SocialFeedBlock block={block} ctx={ctx} />;
    case "socialLinks": return <SocialLinksBlock block={block} />;
    case "newsletter": return <NewsletterBlock block={block} ctx={ctx} />;
    case "contact": return <ContactBlock block={block} />;
    case "venueInfo": return <VenueInfoBlock block={block} vars={ctx.vars} />;
    case "downloads": return <DownloadsBlock block={block} />;
    case "ticketBanner": return <TicketBannerBlock block={block} />;
  }
}

export function BlockRenderer({ blocks, ctx, firstOnPage = true }: { blocks: readonly Block[]; ctx: RenderContext; /** The first block is the first thing on the page (a hero may then use the page h1). */ firstOnPage?: boolean }) {
  return (
    <>
      {blocks.map((block, i) => (
        // display:contents wrapper: no layout effect, but gives themes a stable [data-block="<type>"] selector.
        <div key={block.id} data-block={block.type} className="contents">
          <RenderOne block={block} ctx={ctx} first={firstOnPage && i === 0} />
        </div>
      ))}
    </>
  );
}
