import { z } from 'zod'

// Velden die de gebruiker invult bij create/edit. Status wordt door
// server-actions gezet (niet door client-input).
export const ideaCreateSchema = z.object({
  title: z.string().trim().min(1, 'Titel is verplicht').max(200, 'Maximaal 200 tekens'),
  description: z.string().max(4000, 'Maximaal 4000 tekens').optional().nullable(),
  product_id: z.string().cuid('Ongeldig product').optional().nullable(),
})

export const ideaUpdateSchema = ideaCreateSchema.partial()

export type IdeaCreateInput = z.infer<typeof ideaCreateSchema>
export type IdeaUpdateInput = z.infer<typeof ideaUpdateSchema>

// ---------------------------------------------------------------------------
// plan_md frontmatter — strict format dat door make-plan-job geproduceerd
// wordt en door materializeIdeaPlanAction wordt geparseerd. Zie
// docs/plans/M12-ideas.md "Plan-md formaat A".

const verifyRequiredEnum = z.enum(['ALIGNED', 'ALIGNED_OR_PARTIAL', 'ANY'])

// Task-level priority is geaccepteerd in het schema voor backward-compat,
// maar wordt door `materializeIdeaPlanAction` genegeerd ten faveure van
// story-priority. Reden: worker sorteert op `priority ASC, sort_order ASC`
// — gemixte task-priorities binnen één story zouden de YAML-volgorde
// verstoren. Auteurs hoeven het veld dus niet meer in te vullen.
const planTaskSchema = z.object({
  title: z.string().min(1).max(200),
  description: z.string().max(4000).optional(),
  implementation_plan: z.string().max(8000).optional(),
  priority: z.number().int().min(1).max(4).optional(),
  verify_required: verifyRequiredEnum.optional(),
  verify_only: z.boolean().optional(),
})

const planStorySchema = z.object({
  title: z.string().min(1).max(200),
  description: z.string().max(4000).optional(),
  acceptance_criteria: z.string().max(4000).optional(),
  priority: z.number().int().min(1).max(4),
  tasks: z.array(planTaskSchema).min(1, 'Story moet minimaal 1 taak hebben'),
})

const planPbiSchema = z.object({
  title: z.string().min(1).max(200),
  description: z.string().max(4000).optional(),
  priority: z.number().int().min(1).max(4),
})

export const ideaPlanMdFrontmatterSchema = z.object({
  pbi: planPbiSchema,
  stories: z.array(planStorySchema).min(1, 'Plan moet minimaal 1 story bevatten'),
})

export type IdeaPlanFrontmatter = z.infer<typeof ideaPlanMdFrontmatterSchema>
export type IdeaPlanStory = z.infer<typeof planStorySchema>
export type IdeaPlanTask = z.infer<typeof planTaskSchema>
