/**
 * Quotations & Deals Validators
 */

import { z } from 'zod';

// ═══════════════════════════════════════════════════════════════════════
// Quotation Validators
// ═══════════════════════════════════════════════════════════════════════

export const quotationItemSchema = z.object({
  description: z.string().min(1).max(500),
  quantity: z.number().positive().default(1),
  unitPrice: z.number().min(0).default(0),
});

export const createQuotationSchema = z.object({
  title: z.string().min(1).max(200),
  customerId: z.string().optional(),
  notes: z.string().max(2000).optional(),
  currency: z.string().length(3).default('QAR'),
  taxRate: z.number().min(0).max(100).default(0),
  discountRate: z.number().min(0).max(100).default(0),
  validUntil: z.string().datetime().optional(),
  items: z.array(quotationItemSchema).default([]),
  sendImmediately: z.boolean().default(true),
});

export const updateQuotationSchema = z.object({
  title: z.string().min(1).max(200).optional(),
  customerId: z.string().nullable().optional(),
  notes: z.string().max(2000).nullable().optional(),
  currency: z.string().length(3).optional(),
  taxRate: z.number().min(0).max(100).optional(),
  discountRate: z.number().min(0).max(100).optional(),
  validUntil: z.string().datetime().nullable().optional(),
  status: z.enum(['DRAFT', 'SENT', 'VIEWED', 'ACCEPTED', 'DECLINED', 'EXPIRED', 'CANCELLED']).optional(),
});

export const sendQuotationSchema = z.object({
  quotationId: z.string().min(1),
});

export const quotationFilterSchema = z.object({
  status: z.enum(['DRAFT', 'SENT', 'VIEWED', 'ACCEPTED', 'DECLINED', 'EXPIRED', 'CANCELLED']).optional(),
  customerId: z.string().optional(),
  search: z.string().optional(),
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().max(100).default(20),
  sortBy: z.enum(['createdAt', 'updatedAt', 'total', 'quotationNumber']).default('createdAt'),
  sortOrder: z.enum(['asc', 'desc']).default('desc'),
});

export type CreateQuotationInput = z.infer<typeof createQuotationSchema>;
export type UpdateQuotationInput = z.infer<typeof updateQuotationSchema>;
export type QuotationFilterInput = z.infer<typeof quotationFilterSchema>;
export type QuotationItemInput = z.infer<typeof quotationItemSchema>;
