import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"

export async function GET(req: MedusaRequest, res: MedusaResponse) {
  const homepageCmsService = req.scope.resolve("homepageCms") as any

  const homepages = await homepageCmsService.listHomepages()
  if (!homepages.length) {
    return res.json({ homepage: null })
  }

  const homepage = homepages[0]

  const [heroPhotos, categoryCards, partners] = await Promise.all([
    homepageCmsService.listHeroPhotos({ homepage_id: homepage.id }),
    homepageCmsService.listCategoryCards({ homepage_id: homepage.id }),
    homepageCmsService.listPartners({ homepage_id: homepage.id }),
  ])

  heroPhotos.sort((a: any, b: any) => a.sort_order - b.sort_order)
  categoryCards.sort((a: any, b: any) => a.sort_order - b.sort_order)
  partners.sort((a: any, b: any) => a.sort_order - b.sort_order)

  res.json({
    homepage: {
      ...homepage,
      hero_photos: heroPhotos,
      category_cards: categoryCards,
      partners,
    },
  })
}

export async function POST(req: MedusaRequest, res: MedusaResponse) {
  const homepageCmsService = req.scope.resolve("homepageCms") as any
  const body = req.body as any

  const homepages = await homepageCmsService.listHomepages()

  let homepage: any

  if (homepages.length) {
    homepage = homepages[0]
    await homepageCmsService.updateHomepages({
      id: homepage.id,
      headline: body.headline,
      subtitle: body.subtitle,
      badge_1_text: body.badge_1_text,
      badge_2_text: body.badge_2_text,
      cta_1_label: body.cta_1_label,
      cta_1_link: body.cta_1_link,
      cta_2_label: body.cta_2_label,
      cta_2_link: body.cta_2_link,
      rent_banner_title: body.rent_banner_title,
      rent_banner_text: body.rent_banner_text,
      rent_banner_cta: body.rent_banner_cta,
      section_best_deals_heading: body.section_best_deals_heading,
      section_new_arrivals_heading: body.section_new_arrivals_heading,
      section_partners_heading: body.section_partners_heading,
    })
  } else {
    const created = await homepageCmsService.createHomepages({
      headline: body.headline,
      subtitle: body.subtitle,
      badge_1_text: body.badge_1_text,
      badge_2_text: body.badge_2_text,
      cta_1_label: body.cta_1_label,
      cta_1_link: body.cta_1_link,
      cta_2_label: body.cta_2_label,
      cta_2_link: body.cta_2_link,
      rent_banner_title: body.rent_banner_title,
      rent_banner_text: body.rent_banner_text,
      rent_banner_cta: body.rent_banner_cta,
      section_best_deals_heading: body.section_best_deals_heading,
      section_new_arrivals_heading: body.section_new_arrivals_heading,
      section_partners_heading: body.section_partners_heading,
    })
    homepage = created[0]
  }

  // Replace hero photos
  if (body.hero_photos !== undefined) {
    const existing = await homepageCmsService.listHeroPhotos({ homepage_id: homepage.id })
    if (existing.length) {
      await homepageCmsService.deleteHeroPhotos(existing.map((h: any) => h.id))
    }
    if (body.hero_photos.length) {
      await homepageCmsService.createHeroPhotos(
        body.hero_photos.map((p: any, i: number) => ({
          homepage_id: homepage.id,
          image_url: p.image_url,
          label: p.label,
          rotate: p.rotate,
          sort_order: p.sort_order ?? i,
        }))
      )
    }
  }

  // Replace category cards
  if (body.category_cards !== undefined) {
    const existing = await homepageCmsService.listCategoryCards({ homepage_id: homepage.id })
    if (existing.length) {
      await homepageCmsService.deleteCategoryCards(existing.map((c: any) => c.id))
    }
    if (body.category_cards.length) {
      await homepageCmsService.createCategoryCards(
        body.category_cards.map((c: any, i: number) => ({
          homepage_id: homepage.id,
          label: c.label,
          sub: c.sub,
          image_url: c.image_url,
          handle: c.handle,
          badge: c.badge,
          bg_color: c.bg_color,
          sort_order: c.sort_order ?? i,
        }))
      )
    }
  }

  // Replace partners
  if (body.partners !== undefined) {
    const existing = await homepageCmsService.listPartners({ homepage_id: homepage.id })
    if (existing.length) {
      await homepageCmsService.deletePartners(existing.map((p: any) => p.id))
    }
    if (body.partners.length) {
      await homepageCmsService.createPartners(
        body.partners.map((p: any, i: number) => ({
          homepage_id: homepage.id,
          name: p.name,
          image_url: p.image_url,
          link: p.link ?? "",
          sort_order: p.sort_order ?? i,
        }))
      )
    }
  }

  res.json({ success: true })
}
