import { z } from 'zod'; const CUSTOM_FIELD_TYPES = ['text', 'number', 'date', 'boolean', 'select'] as const; const CUSTOM_FIELD_ENTITIES = ['client', 'interest', 'berth'] as const; export const createFieldSchema = z .object({ entityType: z.enum(CUSTOM_FIELD_ENTITIES), fieldName: z .string() .min(1) .max(50) .regex(/^[a-z_][a-z0-9_]*$/, 'Must be snake_case'), fieldLabel: z.string().min(1).max(100), fieldType: z.enum(CUSTOM_FIELD_TYPES), selectOptions: z .array(z.string().min(1).max(100)) .min(1) .max(50) .optional(), isRequired: z.boolean().default(false), sortOrder: z.number().int().min(0).default(0), }) .refine( (data) => data.fieldType !== 'select' || (data.selectOptions && data.selectOptions.length > 0), { message: 'Select fields must have at least one option', path: ['selectOptions'], }, ); export const updateFieldSchema = z.object({ fieldLabel: z.string().min(1).max(100).optional(), selectOptions: z.array(z.string().min(1).max(100)).optional(), isRequired: z.boolean().optional(), sortOrder: z.number().int().min(0).optional(), // fieldType intentionally omitted — cannot be changed after creation }); export const setValuesSchema = z.object({ values: z.array( z.object({ fieldId: z.string().uuid(), value: z.unknown(), }), ), }); export type CreateFieldInput = z.infer; export type UpdateFieldInput = z.infer; export type SetValuesInput = z.infer;