import { z } from 'zod'; import { BERTH_STATUSES } from '@/lib/constants'; import { baseListQuerySchema } from '@/lib/api/route-helpers'; // ─── Create Berth ──────────────────────────────────────────────────────────── export const createBerthSchema = z.object({ mooringNumber: z.string().min(1), area: z.string().min(1), lengthFt: z.coerce.number().optional(), lengthM: z.coerce.number().optional(), widthFt: z.coerce.number().optional(), widthM: z.coerce.number().optional(), draftFt: z.coerce.number().optional(), draftM: z.coerce.number().optional(), price: z.coerce.number().optional(), priceCurrency: z.string().optional(), status: z.enum(BERTH_STATUSES).default('available'), tenureType: z.enum(['permanent', 'fixed_term']).optional(), mooringType: z.string().optional(), powerCapacity: z.coerce.number().optional(), // kW voltage: z.coerce.number().optional(), // V at 60Hz access: z.string().optional(), bowFacing: z.string().optional(), sidePontoon: z.string().optional(), }); export type CreateBerthInput = z.infer; // ─── Update Berth ───────────────────────────────────────────────────────────── export const updateBerthSchema = z.object({ area: z.string().optional(), lengthFt: z.coerce.number().optional(), lengthM: z.coerce.number().optional(), widthFt: z.coerce.number().optional(), widthM: z.coerce.number().optional(), draftFt: z.coerce.number().optional(), draftM: z.coerce.number().optional(), widthIsMinimum: z.boolean().optional(), nominalBoatSize: z.coerce.number().optional(), // ft nominalBoatSizeM: z.coerce.number().optional(), // m waterDepth: z.coerce.number().optional(), waterDepthM: z.coerce.number().optional(), waterDepthIsMinimum: z.boolean().optional(), sidePontoon: z.string().optional(), powerCapacity: z.coerce.number().optional(), // kW voltage: z.coerce.number().optional(), // V at 60Hz mooringType: z.string().optional(), cleatType: z.string().optional(), cleatCapacity: z.string().optional(), bollardType: z.string().optional(), bollardCapacity: z.string().optional(), access: z.string().optional(), price: z.coerce.number().optional(), priceCurrency: z.string().optional(), bowFacing: z.string().optional(), berthApproved: z.boolean().optional(), tenureType: z.enum(['permanent', 'fixed_term']).optional(), tenureYears: z.coerce.number().int().optional(), tenureStartDate: z.string().optional(), tenureEndDate: z.string().optional(), }); export type UpdateBerthInput = z.infer; // ─── Update Berth Status ────────────────────────────────────────────────────── export const updateBerthStatusSchema = z.object({ status: z.enum(BERTH_STATUSES), reason: z.string().min(1, 'Reason is required'), }); export type UpdateBerthStatusInput = z.infer; // ─── List Berths ────────────────────────────────────────────────────────────── export const listBerthsSchema = baseListQuerySchema.extend({ status: z.enum(BERTH_STATUSES).optional(), area: z.string().optional(), minLength: z.coerce.number().optional(), maxLength: z.coerce.number().optional(), minPrice: z.coerce.number().optional(), maxPrice: z.coerce.number().optional(), tenureType: z.enum(['permanent', 'fixed_term']).optional(), tagIds: z .string() .optional() .transform((v) => (v ? v.split(',') : undefined)), }); export type ListBerthsQuery = z.infer; // ─── Add Maintenance Log ────────────────────────────────────────────────────── export const addMaintenanceLogSchema = z.object({ category: z.enum(['routine', 'repair', 'inspection', 'upgrade']), description: z.string().min(1), cost: z.coerce.number().optional(), costCurrency: z.string().optional(), responsibleParty: z.string().optional(), performedDate: z.string().min(1, 'Performed date is required'), photoFileIds: z.array(z.string()).optional(), }); export type AddMaintenanceLogInput = z.infer; // ─── Update Waiting List ────────────────────────────────────────────────────── export const updateWaitingListSchema = z.object({ entries: z.array( z.object({ clientId: z.string(), position: z.number().int().min(1), priority: z.enum(['normal', 'high']).optional(), notifyPref: z.enum(['email', 'in_app', 'both']).optional(), notes: z.string().optional(), }), ), }); export type UpdateWaitingListInput = z.infer;