import { z } from 'zod'; export const createEventSchema = z.object({ title: z.string().min(1).max(200), description: z.string().max(2000).optional(), richDescription: z.string().max(50000).optional(), date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), startTime: z.string().regex(/^\d{2}:\d{2}$/), endTime: z.string().regex(/^\d{2}:\d{2}$/), doorsOpenTime: z.string().regex(/^\d{2}:\d{2}$/).optional(), eventFormat: z.enum(['IN_PERSON', 'ONLINE', 'HYBRID']).default('IN_PERSON'), venueName: z.string().max(200).optional(), venueAddress: z.string().max(500).optional(), latitude: z.number().min(-90).max(90).optional(), longitude: z.number().min(-180).max(180).optional(), visibility: z.enum(['PUBLIC', 'UNLISTED', 'PRIVATE']).optional(), coverImageUrl: z.string().url().optional(), maxAttendees: z.number().int().positive().optional(), organizerName: z.string().max(200).optional(), organizerEmail: z.string().email().optional(), tiers: z.array(z.object({ name: z.string().min(1).max(100), description: z.string().max(500).optional(), tierType: z.enum(['PAID', 'FREE', 'DONATION']), priceCAD: z.number().int().min(0).default(0), minDonationCAD: z.number().int().min(0).optional(), maxQuantity: z.number().int().positive().optional(), maxPerOrder: z.number().int().min(1).max(100).default(10), salesStartAt: z.string().datetime().optional(), salesEndAt: z.string().datetime().optional(), sortOrder: z.number().int().default(0), })).optional(), }); export const updateEventSchema = z.object({ title: z.string().min(1).max(200).optional(), description: z.string().max(2000).nullable().optional(), richDescription: z.string().max(50000).nullable().optional(), date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(), startTime: z.string().regex(/^\d{2}:\d{2}$/).optional(), endTime: z.string().regex(/^\d{2}:\d{2}$/).optional(), doorsOpenTime: z.string().regex(/^\d{2}:\d{2}$/).nullable().optional(), eventFormat: z.enum(['IN_PERSON', 'ONLINE', 'HYBRID']).optional(), venueName: z.string().max(200).nullable().optional(), venueAddress: z.string().max(500).nullable().optional(), latitude: z.number().min(-90).max(90).nullable().optional(), longitude: z.number().min(-180).max(180).nullable().optional(), visibility: z.enum(['PUBLIC', 'UNLISTED', 'PRIVATE']).optional(), coverImageUrl: z.string().url().nullable().optional(), maxAttendees: z.number().int().positive().nullable().optional(), organizerName: z.string().max(200).nullable().optional(), organizerEmail: z.string().email().nullable().optional(), featured: z.boolean().optional(), }); export const createTierSchema = z.object({ name: z.string().min(1).max(100), description: z.string().max(500).optional(), tierType: z.enum(['PAID', 'FREE', 'DONATION']), priceCAD: z.number().int().min(0).default(0), minDonationCAD: z.number().int().min(0).optional(), maxQuantity: z.number().int().positive().optional(), maxPerOrder: z.number().int().min(1).max(100).default(10), salesStartAt: z.string().datetime().optional(), salesEndAt: z.string().datetime().optional(), sortOrder: z.number().int().default(0), }); export const updateTierSchema = z.object({ name: z.string().min(1).max(100).optional(), description: z.string().max(500).nullable().optional(), tierType: z.enum(['PAID', 'FREE', 'DONATION']).optional(), priceCAD: z.number().int().min(0).optional(), minDonationCAD: z.number().int().min(0).nullable().optional(), maxQuantity: z.number().int().positive().nullable().optional(), maxPerOrder: z.number().int().min(1).max(100).optional(), salesStartAt: z.string().datetime().nullable().optional(), salesEndAt: z.string().datetime().nullable().optional(), sortOrder: z.number().int().optional(), isActive: z.boolean().optional(), }); export const checkoutSchema = z.object({ tierId: z.string().min(1), quantity: z.number().int().min(1).max(100).default(1), buyerEmail: z.string().email(), buyerName: z.string().max(200).optional(), }); export const registerFreeSchema = z.object({ tierId: z.string().min(1), quantity: z.number().int().min(1).max(10).default(1), holderEmail: z.string().email(), holderName: z.string().max(200).optional(), }); export const validateTokenSchema = z.object({ token: z.string().min(1), }); export const confirmCheckinSchema = z.object({ token: z.string().min(1), notes: z.string().max(500).optional(), }); export const manualCheckinSchema = z.object({ eventId: z.string().min(1), ticketCode: z.string().optional(), holderEmail: z.string().email().optional(), notes: z.string().max(500).optional(), }).refine( data => data.ticketCode || data.holderEmail, { message: 'Either ticketCode or holderEmail is required' }, ); export const meetingAccessSchema = z.object({ ticketCode: z.string().min(1), });