import { z } from "zod";

function nullableIntField() {
  return z.preprocess((value) => {
    if (value === "" || value === undefined || value === null) return null;
    const n = Number(value);
    return Number.isInteger(n) ? n : value;
  }, z.number().int().positive().nullable());
}

function nullableStringField() {
  return z.preprocess((value) => {
    if (value === undefined || value === null) return null;
    const str = String(value).trim();
    return str === "" ? null : str;
  }, z.string().nullable());
}

export const taskSchema = z.object({
  title: z.string().trim().min(1, "Titel ist erforderlich").max(255),
  description: nullableStringField().optional(),
  status: z
    .enum(["offen", "in_bearbeitung", "wartet", "erledigt", "abgebrochen"])
    .default("offen"),
  priority: z
    .enum(["sehr_hoch", "hoch", "mittel", "niedrig"])
    .default("mittel"),
  assigned_user_id: nullableIntField().optional(),
  backup_user_id: nullableIntField().optional(),
  committee_id: nullableIntField().optional(),
  case_id: nullableIntField().optional(),
  meeting_id: nullableIntField().optional(),
  agenda_item_id: nullableIntField().optional(),
  decision_id: nullableIntField().optional(),
  due_date: nullableStringField().optional(),
  confidentiality_level: z
    .enum(["intern", "vertraulich", "streng_vertraulich"])
    .default("intern"),
});

export const taskUpdateSchema = taskSchema.partial().refine(
  (data) => Object.keys(data).length > 0,
  {
    message: "Mindestens ein Feld muss gesetzt sein.",
  }
);
