import { z } from "zod"
import { PRODUCT_OPTION_SELECTION_MODES } from "../enums.js"

export const ProductOptionChoiceInputSchema = z.object({
    id: z.string().uuid().optional(),
    code: z.string().trim().min(1).max(191),
    label: z.string().trim().min(1).max(191),
    description: z.string().trim().max(191).nullable().optional(),
    priceDelta: z.number().int().optional().default(0),
    displayOrder: z.number().int().nonnegative().optional().default(0),
    isDefault: z.boolean().optional().default(false),
    nextGroupId: z.string().uuid().nullable().optional(),
    active: z.boolean().optional().default(true),
})

export const ProductOptionGroupInputSchema = z.object({
    id: z.string().uuid().optional(),
    code: z.string().trim().min(1).max(191),
    label: z.string().trim().min(1).max(191),
    selectionMode: z.enum(PRODUCT_OPTION_SELECTION_MODES).optional().default("SINGLE"),
    minChoices: z.number().int().nonnegative().optional().default(1),
    maxChoices: z.number().int().positive().optional().default(1),
    displayOrder: z.number().int().nonnegative().optional().default(0),
    active: z.boolean().optional().default(true),
    choices: z.array(ProductOptionChoiceInputSchema).default([]),
})

export const ProductConfiguratorStepInputSchema = z.object({
    id: z.string().uuid().optional(),
    code: z.string().trim().min(1).max(191),
    label: z.string().trim().min(1).max(191),
    displayOrder: z.number().int().nonnegative().optional().default(0),
    minSelections: z.number().int().nonnegative().optional().default(1),
    maxSelections: z.number().int().positive().optional().default(1),
    repeatCount: z.number().int().positive().optional().default(1),
    entryGroupId: z.string().uuid().nullable().optional(),
})

export const CreateProductConfiguratorSchema = z.object({
    name: z.string().trim().min(1).max(191),
    description: z.string().trim().max(191).nullable().optional(),
    active: z.boolean().optional().default(true),
    optionGroups: z.array(ProductOptionGroupInputSchema).default([]),
    steps: z.array(ProductConfiguratorStepInputSchema).default([]),
})

export const UpdateProductConfiguratorSchema = CreateProductConfiguratorSchema.partial().extend({
    steps: z.array(ProductConfiguratorStepInputSchema).optional(),
})

export type ProductOptionChoiceInput = z.infer<typeof ProductOptionChoiceInputSchema>
export type ProductOptionGroupInput = z.infer<typeof ProductOptionGroupInputSchema>
export type ProductConfiguratorStepInput = z.infer<typeof ProductConfiguratorStepInputSchema>
export type CreateProductConfiguratorInput = z.infer<typeof CreateProductConfiguratorSchema>
export type UpdateProductConfiguratorInput = z.infer<typeof UpdateProductConfiguratorSchema>

