import { z } from "zod";

export const CreateRCIBookingGuestSchema = z.object({
  contactID: z.string().min(1, "Contact ID is required"),
  isPrimaryGuest: z.boolean(),
  type: z.enum(["OWNER", "FAMILY"]),
  sendBookingConfirmation: z.boolean(),
  additional_data: z.object({
    special_requests: z.string().default("NA"),
    has_travel_insurance: z.string().default("false"),
    is_pet_travelling: z.string().default("false"),
    medical_mobility_requirements: z.string().default("None"),
  }),
});

export const CreateRCIBookingChargeSchema = z.object({
  currency: z.string(),
  value: z.number(),
  type: z.enum(["ADDITIONAL_CHARGE", "POINTS", "PROCESSING_FEE", "GUEST_CERTIFICATE_FEE"]),
  name: z.string(),
});

export const CreateRCIBookingUnitSchema = z.object({
  bedroom_type: z.enum(["Hotel", "Studio", "1 Bedroom", "2 Bedroom", "3 Bedroom", "4 Bedroom"]),
  note: z.string().default(""),
  additionalData: z.record(z.string(), z.any()).default({}),
  guests: z.array(CreateRCIBookingGuestSchema),
  adults: z.number().min(0),
  children: z.number().min(0),
  infants: z.number().min(0),
  externalBooking: z.object({
    refID: z.string(),
    additionalData: z.object({
      channel: z.string().default("RCI"),
    }),
  }),
  checkInDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date format (YYYY-MM-DD)"),
  checkOutDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date format (YYYY-MM-DD)"),
  charges: z.array(CreateRCIBookingChargeSchema),
});

export const CreateRCIBookingPaymentDetailsSchema = z.object({
  amount: z.number(),
  currency: z.string(),
  ref_id: z.string(),
  method_name: z.enum(["CREDIT_CARD", "DEBIT_CARD", "NET_BANKING", "UPI", "WALLET"]),
  gateway_name: z.string(),
});

export const CreateRCIBookingSchema = z.object({
  memberRecordID: z.string().min(1, "Member Record ID is required"),
  resort: z.object({
    rciResortCode: z.string().min(1, "Resort code is required"),
    additionalData: z.object({
      partner: z.string().default("RCI"),
    }),
  }),
  inventoryType: z.enum(["EXCHANGE", "RENTAL"]),
  units: z.array(CreateRCIBookingUnitSchema).min(1, "At least one unit is required"),
  bookedAt: z.string().datetime("Invalid datetime"),
  bookingSource: z.string().default("Admin Panel"),
  note: z.string().default(""),
  additionalData: z.record(z.string(), z.any()).default({}),
  paymentDetails: CreateRCIBookingPaymentDetailsSchema,
});

export const SendRCIUnitEDMSchema = z.object({
  memberRecordID: z.string().min(1, "memberRecordID is required"),
});

export type SendRCIUnitEDMRequest = z.infer<typeof SendRCIUnitEDMSchema>;

export type CreateRCIBookingRequest = z.infer<typeof CreateRCIBookingSchema>;
