/**
 * Zod validation schemas for Ticket SLA & Escalation (P063) and
 * Settings: Projects (P062).
 *
 * Re-exported through query files so route handlers import via
 * @zync/db/queries (no-raw-drizzle-from-routes policy).
 */
import { z } from 'zod'

// ── SLA policy schemas ────────────────────────────────────────────────────────

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

export const updateSlaPolicySchema = z.object({
  first_response_hours: z.number().int().min(0).max(8760).optional(),
  resolution_hours: z.number().int().min(0).max(8760).optional(),
  escalation_email: z.string().email().nullable().optional(),
  notify_email: z.boolean().optional(),
  notify_in_app: z.boolean().optional(),
})

export type UpdateSlaPolicyInput = z.infer<typeof updateSlaPolicySchema>

// ── Settings: Projects schemas ────────────────────────────────────────────────

export const projectSettingsSchema = z.object({
  project_default_billing_type: z
    .enum(['fixed', 'hourly', 'retainer'])
    .optional(),
  project_default_hourly_rate: z
    .number()
    .min(0)
    .max(999999.99)
    .optional(),
  project_default_currency: z
    .string()
    .length(3)
    .optional(),
  project_default_time_tracking: z.boolean().optional(),
  project_default_time_rounding_minutes: z
    .union([z.literal(0), z.literal(5), z.literal(15), z.literal(30)])
    .optional(),
  project_default_budget_alert_pct: z
    .number()
    .int()
    .min(1)
    .max(100)
    .optional(),
  project_budget_alert_email: z.boolean().optional(),
  project_budget_alert_in_app: z.boolean().optional(),
})

export type ProjectSettingsInput = z.infer<typeof projectSettingsSchema>
