import { z } from "zod";
import { merkmalTypEnum, geltungsbereichEnum } from "@/db/schema";
import { uuidSchema } from "./common";

/**
 * Zod-Schemas für den Merkmal-Katalog (Admin-Workstream). Werte für `typ` und
 * `geltungsbereich` werden aus den DB-Enums abgeleitet (Single Source of Truth).
 */

export const merkmalTypSchema = z.enum(merkmalTypEnum.enumValues);
export const geltungsbereichSchema = z.enum(geltungsbereichEnum.enumValues);

export const merkmalOptionSchema = z.object({
  wert: z.string().trim().min(1, { message: "Wert ist Pflicht." }),
  label: z.string().trim().min(1, { message: "Bezeichnung ist Pflicht." }),
});

const baseFields = {
  name: z.string().trim().min(1, { message: "Name ist Pflicht." }),
  typ: merkmalTypSchema,
  geltungsbereich: geltungsbereichSchema,
  einheit: z
    .string()
    .trim()
    .optional()
    .transform((v) => (v === "" ? undefined : v)),
  optionen: z.array(merkmalOptionSchema).optional().default([]),
};

/**
 * Verfeinerung: Bei `typ === "enum"` ist mindestens eine Option Pflicht.
 * Liefert klare deutsche Fehlermeldung.
 */
const enumRefinement = (
  data: { typ: string; optionen: { wert: string; label: string }[] },
  ctx: z.RefinementCtx,
): void => {
  if (data.typ === "enum" && data.optionen.length === 0) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      path: ["optionen"],
      message: "Mindestens eine Option ist bei Typ „Auswahl“ erforderlich.",
    });
  }
};

export const merkmalCreateSchema = z
  .object(baseFields)
  .superRefine(enumRefinement);

export const merkmalUpdateSchema = z
  .object({ id: uuidSchema, ...baseFields })
  .superRefine(enumRefinement);

export type MerkmalCreateInput = z.infer<typeof merkmalCreateSchema>;
export type MerkmalUpdateInput = z.infer<typeof merkmalUpdateSchema>;
export type MerkmalOptionInput = z.infer<typeof merkmalOptionSchema>;
