/**
 * Endpoint-level Zod validators for the variants-aware vendor deal API.
 *
 * Defense-in-depth: domain/vendor-deal/create-deal.ts guards business logic;
 * these schemas reject malformed payloads before they reach the domain layer.
 */

import { z } from 'zod';
import { qtyTiersInputSchema } from '@/server/schemas/sku-qty-tiers.js';

// ─── Variant axis / option schemas ───────────────────────────────────────────

export const variantOptionSchema = z.object({
  optionOrder: z.number().int().min(0),
  valueCode: z.string().min(1).max(40),
  labelHe: z.string().min(1).max(40),
  labelEn: z.string().min(1).max(40),
  slotStart: z.coerce.date().nullable().optional(),
  slotEnd: z.coerce.date().nullable().optional(),
  swatchHex: z
    .string()
    .regex(/^#[0-9a-f]{6}$/i)
    .nullable()
    .optional(),
});

export const variantAxisSchema = z.object({
  axisOrder: z.number().int().min(0),
  kind: z.enum(['SIZE', 'COLOR', 'TIMESLOT', 'CUSTOM']),
  nameHe: z.string().min(1).max(40),
  nameEn: z.string().min(1).max(40),
  options: z.array(variantOptionSchema).min(1),
});

export const skuSpecSchema = z.object({
  optionValueCodes: z.array(z.string()),
  originalPrice: z.string().regex(/^\d+(\.\d{1,2})?$/),
  discountPercent: z.number().int().min(1).max(100),
  discountedPrice: z.string().regex(/^\d+(\.\d{1,2})?$/),
  quantityTotal: z.number().int().nonnegative(),
  qtyTiers: qtyTiersInputSchema.optional().default([]),
});

// ─── Pricing-mode block ───────────────────────────────────────────────────────

export const singlePricingSchema = z.object({
  originalPrice: z.string().regex(/^\d+(\.\d{1,2})?$/),
  discountPercent: z.number().int().min(1).max(100),
  discountedPrice: z.string().regex(/^\d+(\.\d{1,2})?$/),
  quantityTotal: z.number().int().positive(),
  qtyTiers: qtyTiersInputSchema.optional().default([]),
});

export const variantsPricingSchema = z.object({
  axes: z.array(variantAxisSchema).min(1).max(3),
  skus: z.array(skuSpecSchema).min(1),
});

// ─── Variants block (mode + payload) ─────────────────────────────────────────

export const addDealVariantsSchema = z.object({
  mode: z.enum(['single', 'variants']),
  single: singlePricingSchema.optional(),
  variants: variantsPricingSchema.optional(),
});

export type AddDealVariants = z.infer<typeof addDealVariantsSchema>;
export type VariantAxisSpec = z.infer<typeof variantAxisSchema>;
export type SkuSpec = z.infer<typeof skuSpecSchema>;
