import { z } from 'zod' export const paginationSchema = z.object({ page: z.coerce.number().int().min(1).max(10000).default(1), pageSize: z.coerce.number().int().min(1).max(100).default(20), }) export const searchSchema = z.object({ city: z.string().trim().max(100).optional(), pickupLocation: z.string().trim().max(100).optional(), dropoffLocation: z.string().trim().max(100).optional(), dropoffMode: z.enum(['same', 'different']).optional(), startDate: z.string().datetime().optional(), endDate: z.string().datetime().optional(), category: z.string().trim().max(50).optional(), maxPrice: z.coerce.number().int().min(0).max(1_000_000).optional(), transmission: z.string().trim().max(20).optional(), make: z.string().trim().max(60).optional(), model: z.string().trim().max(60).optional(), }) export const companiesQuerySchema = z.object({ city: z.string().trim().max(100).optional(), hasOffer: z.string().optional(), }) export const vehicleAvailabilityQuerySchema = z.object({ startDate: z.string().datetime(), endDate: z.string().datetime(), }) export const storefrontReservationSchema = z.object({ vehicleId: z.string().cuid(), companySlug: z.string().trim().max(100).optional(), firstName: z.string().min(1).max(100), lastName: z.string().min(1).max(100), email: z.string().email(), // Contact info — collected at reservation time phone: z.string().min(1).max(30).optional(), // Identity & license — optional at reservation, collected at pickup dateOfBirth: z.string().datetime().optional(), nationality: z.string().min(1).max(100).optional(), identityDocumentNumber: z.string().min(1).max(100).optional(), fullAddress: z.string().min(1).max(500).optional(), driverLicense: z.string().min(1).max(50).optional(), licenseExpiry: z.string().datetime().optional(), licenseIssuedAt: z.string().datetime().optional(), licenseCountry: z.string().min(1).max(100).optional(), licenseCategory: z.string().min(1).max(20).optional(), internationalLicenseNumber: z.string().trim().max(100).optional(), startDate: z.string().datetime(), endDate: z.string().datetime(), pickupLocation: z.string().trim().max(100).optional(), returnLocation: z.string().trim().max(100).optional(), notes: z.string().max(500).optional(), language: z.enum(['en', 'fr', 'ar']).default('fr'), }) export const marketplaceFunnelEventSchema = z.object({ eventName: z.enum([ 'booking_form_viewed', 'trip_dates_selected', 'contact_details_started', 'driver_details_expanded', 'booking_request_submitted', 'booking_request_failed', 'booking_request_success', ]), companySlug: z.string().trim().max(100), vehicleId: z.string().cuid(), sessionId: z.string().trim().max(100).optional(), path: z.string().trim().max(500).optional(), metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(), }) export const reviewBodySchema = z.object({ overallRating: z.number().int().min(1).max(5), vehicleRating: z.number().int().min(1).max(5).optional(), serviceRating: z.number().int().min(1).max(5).optional(), comment: z.string().max(2000).optional(), }) export const slugParamSchema = z.object({ slug: z.string() }) export const vehicleParamSchema = z.object({ slug: z.string(), id: z.string() }) export const reviewTokenSchema = z.object({ token: z.string() }) export const offerCodeParamSchema = z.object({ code: z.string() })