import { z } from "zod"

export const CashSessionCountEntrySchema = z.object({
    denomination: z.number().int().positive(),
    quantity: z.number().int().min(0),
    kind: z.enum(["coin", "bill"]),
})

export const CashSessionCountBreakdownSchema = z.object({
    entries: z.array(CashSessionCountEntrySchema).default([]),
    freeAmount: z.number().int().min(0).default(0),
})

export const CreateCashSessionDraftSchema = z.object({
    openingCash: z.number().int().min(0).optional(),
    counting: CashSessionCountBreakdownSchema.optional(),
    stationId: z.string().uuid(),
})

export const OpenCashSessionSchema = z.object({
    openingCash: z.number().int().min(0).optional(),
    counting: CashSessionCountBreakdownSchema.optional(),
    stationId: z.string().uuid(),
}).refine((value) => value.openingCash !== undefined || value.counting !== undefined, {
    message: "Opening cash or counting is required",
})

export const FinalizeCashSessionDraftSchema = z.object({
    openingCash: z.number().int().min(0).optional(),
    counting: CashSessionCountBreakdownSchema.optional(),
}).refine((value) => value.openingCash !== undefined || value.counting !== undefined, {
    message: "Opening cash or counting is required",
})

export const CloseCashSessionSchema = z.object({
    counting: CashSessionCountBreakdownSchema,
    confirmClose: z.literal(true),
    confirmDifference: z.boolean().optional(),
})

export const CashSessionHistoryQuerySchema = z.object({
    stationId: z.string().uuid().optional(),
    status: z.enum(["OPEN", "CLOSED"]).optional(),
    limit: z.coerce.number().int().min(1).max(100).optional(),
})

export const UpdateCashSessionSchema = z.object({
    openingCash: z.number().int().min(0).optional(),
    counting: CashSessionCountBreakdownSchema.optional(),
}).refine((value) => value.openingCash !== undefined || value.counting !== undefined, {
    message: "At least one field is required",
})

export const CreateCashSessionOperationSchema = z.object({
    type: z.enum(["MANUAL_IN", "MANUAL_OUT"]),
    amount: z.number().int().positive(),
    source: z.string().trim().min(2).max(80),
    note: z.string().trim().max(280).optional(),
})

export type OpenCashSessionInput = z.infer<typeof OpenCashSessionSchema>
export type CreateCashSessionDraftInput = z.infer<typeof CreateCashSessionDraftSchema>
export type FinalizeCashSessionDraftInput = z.infer<typeof FinalizeCashSessionDraftSchema>
export type CloseCashSessionInput = z.infer<typeof CloseCashSessionSchema>
export type UpdateCashSessionInput = z.infer<typeof UpdateCashSessionSchema>
export type CreateCashSessionOperationInput = z.infer<typeof CreateCashSessionOperationSchema>
export type CashSessionHistoryQueryInput = z.infer<typeof CashSessionHistoryQuerySchema>
export type CashSessionCountBreakdownInput = z.infer<typeof CashSessionCountBreakdownSchema>
export type CashSessionCountEntryInput = z.infer<typeof CashSessionCountEntrySchema>

