import { z } from "zod"

export const DepositDefinitionSchema = z.object({
    id: z.string().uuid(),
    shopId: z.string().uuid(),
    label: z.string().trim().min(1),
    amount: z.number().int().nonnegative(),
    active: z.boolean(),
    displayOrder: z.number().int(),
    code: z.string().trim().min(1).nullable().optional(),
    description: z.string().trim().min(1).nullable().optional(),
})

export const CreateDepositDefinitionSchema = z.object({
    label: z.string().trim().min(1).max(191),
    amount: z.number().int().nonnegative(),
    active: z.boolean().optional().default(true),
    displayOrder: z.number().int().nonnegative().optional().default(0),
    code: z.string().trim().min(1).max(191).nullable().optional(),
    description: z.string().trim().min(1).max(191).nullable().optional(),
})

export const UpdateDepositDefinitionSchema = CreateDepositDefinitionSchema.partial()

export const DepositLineInputSchema = z.object({
    depositDefinitionId: z.string().uuid(),
    quantity: z.number().int().positive(),
})

export const OrderDepositLineInputSchema = z.object({
    depositDefinitionId: z.string().uuid(),
    quantity: z.number().int().refine((value) => value !== 0, {
        message: "Quantity must be non-zero",
    }),
})

export const ReplaceOrderDepositLinesSchema = z.object({
    lines: z.array(OrderDepositLineInputSchema).default([]),
})

export const CreateDepositRefundSchema = z.object({
    lines: z.array(DepositLineInputSchema).min(1),
    note: z.string().trim().max(280).optional(),
    orderId: z.string().uuid().optional(),
    cashRefundAmount: z.number().int().positive().optional(),
})

export type DepositDefinitionInput = z.infer<typeof DepositDefinitionSchema>
export type CreateDepositDefinitionInput = z.infer<typeof CreateDepositDefinitionSchema>
export type UpdateDepositDefinitionInput = z.infer<typeof UpdateDepositDefinitionSchema>
export type DepositLineInput = z.infer<typeof DepositLineInputSchema>
export type OrderDepositLineInput = z.infer<typeof OrderDepositLineInputSchema>
export type ReplaceOrderDepositLinesInput = z.infer<typeof ReplaceOrderDepositLinesSchema>
export type CreateDepositRefundInput = z.infer<typeof CreateDepositRefundSchema>

