import { z } from "zod"; import { HANDEDNESS_OPTIONS, POSITIONS } from "@/lib/constants"; const optionalStat = z.union([z.coerce.number().int().min(0), z.null()]).optional(); export const playerSchema = z.object({ firstName: z.string().trim().min(1, "First name is required."), lastName: z.string().trim().min(1, "Last name is required."), jerseyNumber: z.coerce.number().int().min(0).max(999), batsThrows: z.enum(HANDEDNESS_OPTIONS), primaryPosition: z.enum(POSITIONS), secondaryPosition: z.enum(POSITIONS).nullable().optional(), tertiaryPosition: z.enum(POSITIONS).nullable().optional(), isActive: z.boolean(), notes: z.string().max(500).optional().default(""), stats: z .object({ gamesPlayed: optionalStat, atBats: optionalStat, runs: optionalStat, hits: optionalStat, doubles: optionalStat, triples: optionalStat, homeRuns: optionalStat, runsBattedIn: optionalStat, walks: optionalStat, strikeouts: optionalStat, stolenBases: optionalStat }) .optional() }); export const pitchingAppearanceSchema = z.object({ playerId: z.string().min(1), gameDate: z.string().min(1), pitchCount: z.coerce.number().int().min(1).max(200), notes: z.string().max(300).optional().default("") }); export const pitchingRulesSchema = z.array( z.object({ minPitches: z.coerce.number().int().min(0), maxPitches: z.coerce.number().int().positive().nullable(), requiredRestDays: z.coerce.number().int().min(0).max(10) }) ).min(1); export const generateLineupSchema = z.object({ gameDate: z.string().min(1), playerIds: z.array(z.string()).min(1, "Select at least one player."), startingPitcherId: z.string().nullable().optional() }); export const saveLineupSchema = generateLineupSchema.extend({ battingOrder: z.array( z.object({ playerId: z.string(), playerName: z.string(), slot: z.coerce.number().int().positive() }) ).min(1), defensiveAssignments: z.array( z.object({ playerId: z.string(), playerName: z.string(), position: z.enum(POSITIONS) }) ), bench: z.array(z.string()), notes: z.array(z.string()) }); export const saveGameSchema = z.object({ gameDate: z.string().min(1), lineupId: z.string().min(1), opponent: z.string().max(120).optional().default(""), teamScore: z.union([z.coerce.number().int().min(0), z.null()]).optional(), opponentScore: z.union([z.coerce.number().int().min(0), z.null()]).optional(), notes: z.string().max(1000).optional().default(""), playerStats: z.array( z.object({ playerId: z.string().min(1), playerName: z.string().min(1), atBats: optionalStat, runs: optionalStat, hits: optionalStat, doubles: optionalStat, triples: optionalStat, homeRuns: optionalStat, runsBattedIn: optionalStat, walks: optionalStat, strikeouts: optionalStat, stolenBases: optionalStat, pitchCount: optionalStat }) ) });