import { z } from "zod"

import { imageMetaDataSchema, imageSizesSchema } from "./image"

const roomContentSchema = z.object({
  images: z.array(
    z.object({
      metaData: imageMetaDataSchema,
      imageSizes: imageSizesSchema,
    })
  ),
  texts: z.object({
    descriptions: z.object({
      short: z.string(),
      medium: z.string(),
    }),
  }),
})

const roomTypesSchema = z.object({
  name: z.string(),
  description: z.string(),
  code: z.string(),
  roomCount: z.number(),
  mainBed: z.object({
    type: z.string(),
    description: z.string(),
    widthRange: z.object({
      min: z.number(),
      max: z.number(),
    }),
  }),
  fixedExtraBed: z.object({
    type: z.string(),
    description: z.string().optional(),
    widthRange: z.object({
      min: z.number(),
      max: z.number(),
    }),
  }),
  roomSize: z.object({
    min: z.number(),
    max: z.number(),
  }),
  occupancy: z.object({
    total: z.number(),
    adults: z.number(),
    children: z.number(),
  }),
  isLackingCribs: z.boolean(),
  isLackingExtraBeds: z.boolean(),
})

const roomFacilitiesSchema = z.object({
  availableInAllRooms: z.boolean(),
  name: z.string(),
  isUniqueSellingPoint: z.boolean(),
  sortOrder: z.number(),
})

export const roomSchema = z
  .object({
    attributes: z.object({
      name: z.string(),
      sortOrder: z.number(),
      content: roomContentSchema,
      roomTypes: z.array(roomTypesSchema),
      roomFacilities: z.array(roomFacilitiesSchema),
      occupancy: z.object({
        total: z.number(),
        adults: z.number(),
        children: z.number(),
      }),
      roomSize: z.object({
        min: z.number(),
        max: z.number(),
      }),
    }),
    id: z.string(),
    type: z.enum(["roomcategories"]),
  })
  .transform((data) => {
    return {
      descriptions: data.attributes.content.texts.descriptions,
      id: data.id,
      images: data.attributes.content.images,
      name: data.attributes.name,
      occupancy: data.attributes.occupancy,
      roomSize: data.attributes.roomSize,
      roomTypes: data.attributes.roomTypes,
      sortOrder: data.attributes.sortOrder,
      type: data.type,
      roomFacilities: data.attributes.roomFacilities,
    }
  })

export type RoomType = Pick<z.output<typeof roomSchema>, "roomTypes" | "name">
