import { z } from 'zod'; /* ================= MEDIA ================= */ export const MediaDto = z.object({ mediaType: z.string().optional(), // "image/jpeg", "video/mp4", etc. mediaFileName: z.string(), // S3 file URL }); /* ================= PRICE ================= * ❌ No tax info here; root-level only */ export const PriceDto = z.object({ noOfSession: z.number().int().optional().default(1), isPackage: z.boolean().optional().default(false), sessionValidity: z.number().int().optional().default(0), sessionValidityFrequency: z.string().optional().default('Days'), basePrice: z.number().int().optional().default(0), sellPrice: z.number().int(), // required }); /* ================= VENUE ================= */ export const VenueDto = z.object({ venueName: z.string(), venueLabel: z.string(), venueCapacity: z.number().int().optional().default(0), availableSeats: z.number().int().optional().default(0), isMinPeopleReqMandatory: z.boolean().optional().default(false), minPeopleRequired: z.number().int().nullable().optional(), minReqfullfilledBeforeMins: z.number().int().nullable().optional(), venueDescription: z.string().optional(), // βœ… new: media per venue (for ActivityVenueArtifacts) media: z.array(MediaDto).optional().default([]), // price list per venue prices: z.array(PriceDto).optional().default([]), }); /* ================= PICKUP / DROP ================= */ export const PickupDetailDto = z.object({ isPickUp: z.boolean().optional().default(false), locationLat: z.number().nullable().optional(), locationLong: z.number().nullable().optional(), locationAddress: z.string().nullable().optional(), transportTotalPrice: z.number().int().min(1), }); export const PickupTransportDto = z.object({ transportModeXid: z.number().int(), pickupDetails: z.array(PickupDetailDto).optional().default([]), }); /* ================= EQUIPMENT ================= */ export const EquipmentDto = z.object({ equipmentName: z.string(), isEquipmentChargeable: z.boolean().optional().default(false), equipmentBasePrice: z.number().int().optional().default(0), equipmentTotalPrice: z.number().int().optional().default(0), }); /* ================= ELIGIBILITY ================= */ export const EligibilityDto = z.object({ isAgeRestriction: z.boolean().optional().default(false), ageRestrictionName: z.string().nullable().optional(), ageEntered: z.number().int().nullable().optional(), ageIn: z.string().nullable().optional(), minAge: z.number().int().nullable().optional(), maxAge: z.number().int().nullable().optional(), isWeightRestriction: z.boolean().optional().default(false), weightRestrictionName: z.string().nullable().optional(), weightEntered: z.number().int().nullable().optional(), weightIn: z.string().nullable().optional(), minWeight: z.number().int().nullable().optional(), maxWeight: z.number().int().nullable().optional(), isHeightRestriction: z.boolean().optional().default(false), heightRestrictionName: z.string().nullable().optional(), heightEntered: z.number().int().nullable().optional(), heightIn: z.string().nullable().optional(), minHeight: z.number().int().nullable().optional(), maxHeight: z.number().int().nullable().optional(), }); /* ================= OTHER DETAILS ================= */ export const OtherDetailsDto = z.object({ exclusiveNotes: z.string().optional(), dosNotes: z.string().optional(), dontsNotes: z.string().optional(), tipsNotes: z.string().optional(), termsAndCondition: z.string().optional(), }); /* ================= CREATE ACTIVITY ================= */ export const CreateActivityDto = z.object({ /* πŸ”‘ REQUIRED */ activityXid: z.number().int(), /* OPTIONAL CORE */ activityTypeXid: z.number().int().optional(), frequenciesXid: z.number().int().nullable().optional(), activityTitle: z.string().optional(), activityDescription: z.string().optional(), /* LOCATION */ checkInLat: z.number().nullable().optional(), checkInLong: z.number().nullable().optional(), checkInAddress: z.string().nullable().optional(), isCheckOutSame: z.boolean().optional().default(true), checkOutLat: z.number().nullable().optional(), checkOutLong: z.number().nullable().optional(), checkOutAddress: z.string().nullable().optional(), /* DURATION / ENERGY */ energyLevelXid: z.number().int().nullable().optional(), durationDays: z.number().int().optional(), durationHours: z.number().int().optional(), durationMins: z.number().int().optional(), /* FLAGS */ foodAvailable: z.boolean().optional().default(false), foodIsChargeable: z.boolean().optional().default(false), alcoholAvailable: z.boolean().optional().default(false), trainerAvailable: z.boolean().optional().default(false), trainerIsChargeable: z.boolean().optional().default(false), pickUpDropAvailable: z.boolean().optional().default(false), pickUpDropIsChargeable: z.boolean().optional().default(false), inActivityAvailable: z.boolean().optional().default(false), inActivityIsChargeable: z.boolean().optional().default(false), equipmentAvailable: z.boolean().optional().default(false), equipmentIsChargeable: z.boolean().optional().default(false), cancellationAvailable: z.boolean().optional().default(false), cancellationAllowedBeforeMins: z.number().int().nullable().optional(), /* MONEY / CURRENCY */ currencyXid: z.number().int().nullable().optional(), sustainabilityScore: z.number().int().nullable().optional(), safetyScore: z.number().int().nullable().optional(), isInstantBooking: z.boolean().optional().default(false), /* πŸ”₯ ROOT-LEVEL TAX (SINGLE SOURCE OF TRUTH) */ taxXids: z.array(z.number().int()).optional().default([]), /* πŸ”₯ MEDIA ARRAYS */ media: z.array(MediaDto).optional().default([]), // Activity-level media venues: z.array(VenueDto).optional().default([]), // Each venue’s media + prices /* RELATION ARRAYS */ foodTypeIds: z.array(z.number().int()).optional().default([]), cuisineIds: z.array(z.number().int()).optional().default([]), pickupTransports: z.array(PickupTransportDto).optional().default([]), navigationModes: z.array(z.number().int()).optional().default([]), equipments: z.array(EquipmentDto).optional().default([]), amenitiesIds: z.array(z.number().int()).optional().default([]), foodTotalAmount: z.number().int().optional().default(0), /* EXTRA OBJECTS */ eligibility: EligibilityDto.optional(), otherDetails: OtherDetailsDto.optional(), allowedEntryTypes: z.array(z.number().int()).optional().default([]), navigationModeIsChargeable: z.boolean().optional().default(false), trainerTotalAmount: z.number().int().optional().default(0), navigationModeTotalPrice: z.number().int().optional().default(0), }); export type CreateActivityInput = z.infer;