// ── API: akteType-bepaling uit structurele dossierkenmerken (MCP) ───────────
// Geeft een agent het voorgestelde akteType terug op basis van uitsluitend
// het dossiertype en (bij verkoop) of er al een compromisdatum gekend is —
// nooit namen, adressen of bedragen. Persoonsgegevens van het dossier mogen
// de server nooit bereiken (zie AGENTS.md); de agent vult de echte
// parameters pas lokaal in via haalModeldocument. Hergebruikt bepaalAkteType
// (lib/dossier/akteType.ts) met een minimaal, structuur-only Dossier-fragment.

import { NextResponse } from "next/server";
import { bepaalAkteType } from "@/lib/dossier/akteType";
import { registreerGebruik } from "@/lib/gebruikslog";
import { seedModellen } from "@/data/modeldocumenten";
import { isVerkoopDossier, maakLeegDossier, type Dossier, type Dossiertype } from "@/lib/dossier/types";

const DOSSIERTYPES: Dossiertype[] = [
  "verkoop-met-krediet",
  "verkoop-zonder-krediet",
  "schenking",
  "nalatenschap",
  "aanpassing-statuten-vennootschap",
  "keuzetestament",
  "testament-gezinswoning",
];

/** Minimaal Dossier-fragment: enkel de structurele velden die bepaalAkteType gebruikt. */
function structureelDossier(dossiertype: Dossiertype, heeftCompromisdatum: boolean): Dossier {
  const dossier = maakLeegDossier(dossiertype, {
    id: "structureel",
    status: "compromis-ontvangen",
    partijen: { waarde: [], bron: "compromis" },
    ontbrekendeStukken: [],
    tegenstrijdigheden: [],
    aangemaakt: "",
    aangepast: "",
  });
  // De compromisdatum bestaat enkel op verkoopdossiers (discriminated union).
  if (heeftCompromisdatum && isVerkoopDossier(dossier)) {
    dossier.compromisdatum = { waarde: "onbekend", bron: "compromis" };
  }
  return dossier;
}

export async function POST(request: Request) {
  let body: unknown;
  try {
    body = await request.json();
  } catch {
    return NextResponse.json({ fout: "Ongeldige JSON-body." }, { status: 400 });
  }

  const { dossiertype, heeftCompromisdatum } = (body ?? {}) as Record<string, unknown>;

  if (typeof dossiertype !== "string" || !DOSSIERTYPES.includes(dossiertype as Dossiertype)) {
    return NextResponse.json(
      { fout: `'dossiertype' is verplicht en moet één van ${DOSSIERTYPES.join(", ")} zijn.` },
      { status: 400 }
    );
  }

  const akteTypeKeuze = bepaalAkteType(
    structureelDossier(dossiertype as Dossiertype, heeftCompromisdatum === true)
  );

  const model = akteTypeKeuze.akteType
    ? seedModellen.find((m) => m.akteType === akteTypeKeuze.akteType && (m.taal ?? "nl") === "nl")
    : undefined;
  if (akteTypeKeuze.akteType && !model) {
    await registreerGebruik({ type: "onbekend_modeldocument", waarde: akteTypeKeuze.akteType });
  }

  return NextResponse.json({ akteTypeKeuze, modelGevonden: Boolean(model), modelId: model?.id });
}
