import heroSlidesJson from '@/public/data/hero-slides.json'

export const HERO_OVERLAYS = [
  'from-luxury-dark/60 to-luxury-dark/40',
  'from-luxury-dark/70 to-luxury-dark/50',
  'from-luxury-dark/80 to-luxury-dark/60',
] as const

export type HeroOverlay = (typeof HERO_OVERLAYS)[number]

export type HeroSlide = {
  id: number
  title: string
  subtitle: string
  description: string
  cta: string
  image: string
  link: string
  bgColor: HeroOverlay
  order: number
  active: boolean
}

export type HeroSettings = {
  version: 1
  slides: HeroSlide[]
}

function record(value: unknown): Record<string, unknown> {
  return value && typeof value === 'object' ? value as Record<string, unknown> : {}
}

function text(value: unknown, max: number) {
  return typeof value === 'string' ? value.trim().slice(0, max) : ''
}

function parseSlides(source: unknown[]): HeroSlide[] {
  const usedIds = new Set<number>()
  return source
    .map(record)
    .map((slide, index): HeroSlide | null => {
      const title = text(slide.title, 120)
      const image = text(slide.image, 2000)
      if (!title || !image) return null
      let id = Number.isInteger(Number(slide.id)) && Number(slide.id) > 0 ? Number(slide.id) : index + 1
      while (usedIds.has(id)) id += 1
      usedIds.add(id)
      return {
        id,
        title,
        subtitle: text(slide.subtitle, 120),
        description: text(slide.description, 500),
        cta: text(slide.cta, 60),
        image,
        link: text(slide.link, 2000),
        bgColor: HERO_OVERLAYS.includes(slide.bgColor as HeroOverlay) ? slide.bgColor as HeroOverlay : HERO_OVERLAYS[0],
        order: Number.isFinite(Number(slide.order)) ? Math.max(1, Math.round(Number(slide.order))) : index + 1,
        active: typeof slide.active === 'boolean' ? slide.active : true,
      }
    })
    .filter((slide): slide is HeroSlide => slide !== null)
    .sort((a, b) => a.order - b.order || a.id - b.id)
}

export const defaultHeroSlides = parseSlides(heroSlidesJson as unknown[])

export function normalizeHeroSettings(value: unknown): HeroSettings {
  const root = record(value)
  const source = Array.isArray(value)
    ? value
    : Array.isArray(root.slides)
      ? root.slides
      : defaultHeroSlides
  return { version: 1, slides: parseSlides(source) }
}
