/**
 * Zod validation schemas for recurring tasks & templates — recurring-tasks-templates.
 * Shared between zync-api route handlers and zync-app React forms.
 */
import { z } from 'zod'
import { RRule } from 'rrule'

// ── Priority enum (matches schema CHECK constraint) ──────────────────────────

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

// ── RRULE validator ───────────────────────────────────────────────────────────

/** Non-empty string that can be parsed by rrule.js RRule.fromString */
export const rruleStringSchema = z
  .string()
  .min(1, 'Recurrence rule is required')
  .refine(
    (val) => {
      try {
        RRule.fromString(val)
        return true
      } catch {
        return false
      }
    },
    { message: 'Invalid RRULE string — must be a valid RFC 5545 RRULE' },
  )

// ── Recurring task schemas ────────────────────────────────────────────────────

export const createRecurringTaskSchema = z.object({
  title: z.string().min(1).max(500),
  description: z.string().nullable().optional(),
  project_id: z.string().uuid().nullable().optional(),
  assignee_id: z.string().uuid().nullable().optional(),
  estimated_hours: z.number().min(0).max(9999.99).nullable().optional(),
  priority: recurringPrioritySchema.optional().default('medium'),
  labels: z.array(z.string().max(100)).optional().default([]),
  recurrence: rruleStringSchema,
  advance_days: z.number().int().min(0).max(365),
  status_id: z.string().uuid().nullable().optional(),
})

export type CreateRecurringTaskSchemaInput = z.infer<typeof createRecurringTaskSchema>

export const updateRecurringTaskSchema = z.object({
  title: z.string().min(1).max(500).optional(),
  description: z.string().nullable().optional(),
  project_id: z.string().uuid().nullable().optional(),
  assignee_id: z.string().uuid().nullable().optional(),
  estimated_hours: z.number().min(0).max(9999.99).nullable().optional(),
  priority: recurringPrioritySchema.optional(),
  labels: z.array(z.string().max(100)).optional(),
  recurrence: rruleStringSchema.optional(),
  advance_days: z.number().int().min(0).max(365).optional(),
  status_id: z.string().uuid().nullable().optional(),
  is_active: z.boolean().optional(),
})

export type UpdateRecurringTaskSchemaInput = z.infer<typeof updateRecurringTaskSchema>

// ── Task template schemas ─────────────────────────────────────────────────────

export const createTaskTemplateSchema = z.object({
  name: z.string().min(1).max(200),
  title: z.string().min(1).max(500),
  description: z.string().nullable().optional(),
  estimated_hours: z.number().min(0).max(9999.99).nullable().optional(),
  priority: recurringPrioritySchema.optional().default('medium'),
  labels: z.array(z.string().max(100)).optional().default([]),
})

export type CreateTaskTemplateSchemaInput = z.infer<typeof createTaskTemplateSchema>
