import { z } from "zod" import { BedTypeEnum, ExtraBedTypeEnum } from "@/constants/booking" import { imageSchema } from "./image" const roomContentSchema = z.object({ images: z.array(imageSchema), texts: z.object({ descriptions: z.object({ short: z.string().optional(), medium: z.string().optional(), }), }), }) 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(), }), }) .transform((data) => ({ type: data.type in BedTypeEnum ? (data.type as BedTypeEnum) : BedTypeEnum.Other, description: data.description, widthRange: data.widthRange, })), fixedExtraBed: z .object({ type: z.string(), description: z.string().optional(), widthRange: z.object({ min: z.number(), max: z.number(), }), }) .transform((data) => { return data.type in ExtraBedTypeEnum ? { type: data.type as ExtraBedTypeEnum, description: data.description, } : undefined }), 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(), icon: z.string().optional(), }) 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({ min: z.number(), max: z.number(), }), roomSize: z.object({ min: z.number(), max: z.number(), }), }), id: z.string(), type: z.literal("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, totalOccupancy: data.attributes.occupancy.min === data.attributes.occupancy.max ? { max: data.attributes.occupancy.max, range: `${data.attributes.occupancy.max}`, } : { max: data.attributes.occupancy.max, range: `${data.attributes.occupancy.min}-${data.attributes.occupancy.max}`, }, roomSize: data.attributes.roomSize, roomTypes: data.attributes.roomTypes, sortOrder: data.attributes.sortOrder, type: data.type, roomFacilities: data.attributes.roomFacilities, } }) export type RoomType = Pick, "roomTypes" | "name">