/**
 * Wedding Collective page data layer.
 *
 * Same pattern as homepage & green-energy: bundled defaults with
 * Strapi merge-over-defaults when enabled.
 */

import { fetchSingle, getMediaUrl } from "@/lib/strapi/client"
import { isStrapiEnabled } from "@/lib/strapi/config"
import { normalizeCmsLink } from "@/lib/api/links"
import type { WeddingCollectiveData, StrapiMedia } from "@/lib/strapi/types"

/* ------------------------------------------------------------------ */
/*  Bundled defaults                                                   */
/* ------------------------------------------------------------------ */

export const weddingCollectiveDefaults: WeddingCollectiveData = {
  hero: {
    videoUrl: "/assets/wedding-collective/wedding-cover.mp4",
    heading: "Wedding Collective",
  },
  gallery: {
    badgeIcon: "/assets/leaders/sparkle-icon.svg",
    badgeDesktopText: "Photos and videos from wedding hall",
    badgeMobileText: "Photos & videos",
    description:
      "Our gallery showcases our craft's evolution, the people behind it, and the passion that continues to shape our story.",
    images: [
      "/assets/Wedding/Ocean Pearl .jpg",
      "/assets/Wedding/Ocean Pearl  (1).jpg",
      "/assets/Wedding/Ocean Pearl  (2).jpg",
      "/assets/Wedding/Ocean Pearl  (3).jpg",
      "/assets/Wedding/Beach Front Lawn South Indian wedding.jpeg",
      "/assets/Wedding/Ocean Pearl  (4).jpg",
      "/assets/Wedding/Ocean Pearl  (5).jpg",
      "/assets/Wedding/Pearl Harbor 1.jpg",
      "/assets/Wedding/Beach Wedding Decor.jpg",
      "/assets/Wedding/Destination Beach Wedding.jpeg",
      "/assets/Wedding/Grand Wedding Couple.jpeg",
      "/assets/Wedding/Pearl Harbor 2.jpeg",
      "/assets/Wedding/Plam Beach Lawn.jpg",
      "/assets/Wedding/South Indian Couple Photoshoot.jpg",
      "/assets/Wedding/Water Front Lawn.jpeg",
      "/assets/Wedding/Wow lawn Aeroplane.jpg",
    ],
  },
  inquiry: {
    image: "/assets/wedding-collective/inquiry-couple.png",
    heading: "Inquire here",
    fullNamePlaceholder: "Full Name",
    mobilePlaceholder: "Mobile Number",
    emailPlaceholder: "Email ID",
    eventTypePlaceholder: "Event Type",
    eventTypes: ["Wedding", "Reception", "Engagement", "Other"],
    eventBudgetPlaceholder: "Event Budget",
    eventBudgets: ["Under ₹5 Lakh", "₹5 - 10 Lakh", "₹10 - 25 Lakh", "₹25 Lakh+"],
    eventDatePlaceholder: "Event Date",
    eventTimePlaceholder: "Event time",
    requirementsPlaceholder: "Type you additional requirements...",
    ctaLabel: "Send Message",
    ctaHref: "",
  },
}

/* ------------------------------------------------------------------ */
/*  Helpers                                                           */
/* ------------------------------------------------------------------ */

type AnyRec = Record<string, unknown>

function str(val: unknown, fallback = ""): string {
  if (typeof val === "string") return val.trim() !== "" ? val : fallback
  if (typeof val === "number") return String(val)
  return fallback
}

function media(val: unknown): string {
  return getMediaUrl(val as StrapiMedia | null | undefined)
}

function withFallback<T>(value: T[] | undefined | null, fallback: T[]): T[] {
  return value && value.length > 0 ? value : fallback
}

/* ------------------------------------------------------------------ */
/*  Public API                                                        */
/* ------------------------------------------------------------------ */

export async function getWeddingCollectiveData(): Promise<WeddingCollectiveData> {
  const d = weddingCollectiveDefaults

  if (!isStrapiEnabled) return d

  const entry = await fetchSingle<AnyRec>("wedding-collective")

  if (!entry) return d

  const hero = (entry.hero as AnyRec | undefined) ?? {}
  const gallery = (entry.gallery as AnyRec | undefined) ?? {}
  const inquiry = (entry.inquiry as AnyRec | undefined) ?? {}
  const imageRows = (gallery.images as AnyRec[] | undefined) ?? []

  return {
    hero: {
      videoUrl: media(hero.videoUrl_16x9) || str(hero.videoUrl) || d.hero.videoUrl,
      heading: str(hero.heading, d.hero.heading),
    },
    gallery: {
      badgeIcon: d.gallery.badgeIcon,
      badgeDesktopText: str(gallery.badgeDesktopText),
      badgeMobileText: str(gallery.badgeMobileText),
      description: str(gallery.description),
      images: withFallback(
        imageRows
          .map((row) => media(row.image_3x2) || str(row.imageUrl))
          .filter(Boolean),
        d.gallery.images,
      ),
    },
    inquiry: {
      image: media(inquiry.image_1x1) || d.inquiry.image,
      heading: str(inquiry.heading, d.inquiry.heading),
      fullNamePlaceholder: str(inquiry.fullNamePlaceholder, d.inquiry.fullNamePlaceholder),
      mobilePlaceholder: str(inquiry.mobilePlaceholder, d.inquiry.mobilePlaceholder),
      emailPlaceholder: str(inquiry.emailPlaceholder, d.inquiry.emailPlaceholder),
      eventTypePlaceholder: str(inquiry.eventTypePlaceholder, d.inquiry.eventTypePlaceholder),
      eventTypes: withFallback(
        ((inquiry.eventTypes as AnyRec[]) ?? []).map((r) => str(r.label)),
        d.inquiry.eventTypes,
      ),
      eventBudgetPlaceholder: str(inquiry.eventBudgetPlaceholder, d.inquiry.eventBudgetPlaceholder),
      eventBudgets: withFallback(
        ((inquiry.eventBudgets as AnyRec[]) ?? []).map((r) => str(r.label)),
        d.inquiry.eventBudgets,
      ),
      eventDatePlaceholder: str(inquiry.eventDatePlaceholder, d.inquiry.eventDatePlaceholder),
      eventTimePlaceholder: str(inquiry.eventTimePlaceholder, d.inquiry.eventTimePlaceholder),
      requirementsPlaceholder: str(inquiry.requirementsPlaceholder, d.inquiry.requirementsPlaceholder),
      ctaLabel: str(inquiry.ctaButtonText, d.inquiry.ctaLabel),
      ctaHref: normalizeCmsLink(inquiry.ctaButtonLink, d.inquiry.ctaHref),
    },
  }
}
