/**
 * Zod validation schemas for CRM Support Center — crm-support-center.
 * Shared between zync-api route handlers and zync-app React forms.
 * Re-exported through @zync/db/queries (no-raw-drizzle-from-routes policy).
 */
import { z } from 'zod'

// ── Enum schemas (must match schema CHECK constraints byte-for-byte) ──────────

export const ticketStatusSchema = z.enum([
  'open',
  'in_progress',
  'pending_customer',
  'resolved',
  'closed',
])

export const ticketPrioritySchema = z.enum(['low', 'medium', 'high', 'urgent'])

export const ticketSourceSchema = z.enum(['web', 'email', 'telegram', 'whatsapp', 'portal'])

export const messageAuthorTypeSchema = z.enum(['staff', 'customer', 'system'])

// ── Ticket CRUD ───────────────────────────────────────────────────────────────

export const createTicketSchema = z.object({
  title: z.string().min(1).max(500),
  description: z.string().max(10000).optional().default(''),
  priority: ticketPrioritySchema.optional().default('medium'),
  category_id: z.string().uuid().nullable().optional(),
  assignee_id: z.string().uuid().nullable().optional(),
  customer_id: z.string().uuid().nullable().optional(),
  contact_id: z.string().uuid().nullable().optional(),
  source: ticketSourceSchema.optional().default('web'),
  external_id: z.string().max(500).nullable().optional(),
  external_thread_id: z.string().max(500).nullable().optional(),
})

export type CreateTicketInput = z.infer<typeof createTicketSchema>

export const updateTicketSchema = z.object({
  title: z.string().min(1).max(500).optional(),
  description: z.string().max(10000).optional(),
  status: ticketStatusSchema.optional(),
  priority: ticketPrioritySchema.optional(),
  category_id: z.string().uuid().nullable().optional(),
  assignee_id: z.string().uuid().nullable().optional(),
})

export type UpdateTicketInput = z.infer<typeof updateTicketSchema>

// ── Reply ─────────────────────────────────────────────────────────────────────

export const replyTicketSchema = z.object({
  content: z.string().min(1).max(50000),
})

export type ReplyTicketInput = z.infer<typeof replyTicketSchema>

// ── Categories ────────────────────────────────────────────────────────────────

export const createTicketCategorySchema = z.object({
  name: z.string().min(1).max(100),
  color: z.string().max(50).nullable().optional(),
})

export type CreateTicketCategoryInput = z.infer<typeof createTicketCategorySchema>

// ── Filters ───────────────────────────────────────────────────────────────────

export const ticketFiltersSchema = z.object({
  status: z.string().optional(),
  priority: z.string().optional(),
  assignee_id: z.string().uuid().optional(),
  category_id: z.string().uuid().optional(),
  customer_id: z.string().uuid().optional(),
  source: z.string().optional(),
  sla_breached: z
    .union([z.literal('true'), z.literal('false')])
    .transform((value) => value === 'true')
    .optional(),
  q: z.string().max(200).optional(),
  cursor: z.string().optional(),
  limit: z.coerce.number().int().min(1).max(100).optional().default(50),
})

export type TicketFiltersInput = z.infer<typeof ticketFiltersSchema>
