import { z } from "zod"

import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums"
import type { Location } from "@/types/trpc/routers/hotel/locations"

export const guestRoomSchema = z
  .object({
    adults: z.number().default(1),
    child: z
      .array(
        z.object({
          age: z.number().min(0, "Age is required"),
          bed: z.number().min(0, "Bed choice is required"),
        })
      )
      .default([]),
  })
  .superRefine((value, ctx) => {
    const childrenInAdultsBed = value.child.filter(
      (c) => c.bed === ChildBedMapEnum.IN_ADULTS_BED
    )
    if (value.adults < childrenInAdultsBed.length) {
      const lastAdultBedIndex = value.child
        .map((c) => c.bed)
        .lastIndexOf(ChildBedMapEnum.IN_ADULTS_BED)

      ctx.addIssue({
        code: z.ZodIssueCode.custom,
        message:
          "You cannot have more children in adults bed than adults in the room",
        path: ["child", lastAdultBedIndex],
      })
    }
  })

export const guestRoomsSchema = z.array(guestRoomSchema)

export const bookingWidgetSchema = z.object({
  bookingCode: z.string(), // Update this as required when working with booking codes component
  date: z.object({
    // Update this as required once started working with Date picker in Nights component
    fromDate: z.string(),
    toDate: z.string(),
  }),
  location: z.string().refine(
    (value) => {
      if (value) {
        const parsedValue: Location = JSON.parse(decodeURIComponent(value))
        switch (parsedValue?.type) {
          case "cities":
          case "hotels":
            return true
          default:
            return false
        }
      }
    },
    { message: "Required" }
  ),
  redemption: z.boolean().default(false),
  rooms: guestRoomsSchema,
  search: z.string({ coerce: true }).min(1, "Required"),
  voucher: z.boolean().default(false),
})
