import { z } from "zod" import { Lang } from "@scandic-hotels/common/constants/language" import { PaymentMethodEnum } from "@scandic-hotels/common/constants/paymentMethod" import { ChildBedTypeEnum } from "../../../../enums/childBedTypeEnum" const paymentSchema = z.object({ paymentMethod: z.nativeEnum(PaymentMethodEnum), card: z .object({ alias: z.string(), expiryDate: z.string(), cardType: z.string(), }) .optional(), cardHolder: z .object({ email: z.string().email(), name: z.string(), phoneCountryCode: z.string(), phoneSubscriber: z.string(), }) .optional(), success: z.string(), error: z.string(), cancel: z.string(), }) const roomsSchema = z .array( z.object({ adults: z.number().int().nonnegative(), bookingCode: z.string().nullish(), childrenAges: z .array( z.object({ age: z.number().int().nonnegative(), bedType: z.nativeEnum(ChildBedTypeEnum), }) ) .default([]), rateCode: z.string(), redemptionCode: z.string().optional(), roomTypeCode: z.coerce.string(), guest: z.object({ becomeMember: z.boolean(), countryCode: z.string(), dateOfBirth: z.string().nullish(), email: z.string().email(), firstName: z.string(), lastName: z.string(), membershipNumber: z.string().nullish(), postalCode: z.string().nullish(), phoneNumber: z.string(), partnerLoyaltyNumber: z.string().nullable(), }), smsConfirmationRequested: z.boolean(), specialRequest: z.object({ comment: z.string().optional(), }), packages: z.object({ breakfast: z.boolean(), allergyFriendly: z.boolean(), petFriendly: z.boolean(), accessibility: z.boolean(), }), roomPrice: z.object({ memberPrice: z.number().nullish(), publicPrice: z.number().nullish(), }), }) ) .superRefine((data, ctx) => { data.forEach((room, idx) => { if (idx === 0 && room.guest.becomeMember) { if (!room.guest.dateOfBirth) { ctx.addIssue({ code: z.ZodIssueCode.invalid_type, expected: "string", received: typeof room.guest.dateOfBirth, path: ["guest", "dateOfBirth"], }) } if (!room.guest.postalCode) { ctx.addIssue({ code: z.ZodIssueCode.invalid_type, expected: "string", received: typeof room.guest.postalCode, path: ["guest", "postalCode"], }) } } }) }) export type CreateBookingInput = z.input export const createBookingInput = z.object({ hotelId: z.string(), checkInDate: z.string(), checkOutDate: z.string(), rooms: roomsSchema, payment: paymentSchema.optional(), language: z.nativeEnum(Lang), partnerSpecific: z .object({ eurobonusAccessToken: z.string(), }) .optional(), })