// ── API: volgende stappen uit structurele dossierdata (MCP) ──────────────────
// Geeft een agent per dossierfase de concrete acties en modelmail-categorieën
// van de opvolgingsmotor terug — structureel-only (dossiertype + status +
// optionele vlaggen zoals appartement of krediet-aanvaard), nooit namen,
// adressen of bedragen. Hergebruikt stelOpvolgingSamenAutonoom
// (lib/dossier/opvolging.ts) met een minimaal Dossier-fragment, zodat MCP en
// app gegarandeerd dezelfde route en acties geven.

import { NextResponse } from "next/server";
import { stelOpvolgingSamenAutonoom, isIsoDatum } from "@/lib/dossier/opvolging";
import {
  maakLeegDossier,
  maakVeld,
  isVerkoopDossier,
  type Dossier,
  type DossierStatus,
  type Dossiertype,
} from "@/lib/dossier/types";

const STATUSSEN: DossierStatus[] = [
  "compromis-ontvangen",
  "opzoekingen-lopend",
  "ontwerp-in-opmaak",
  "ontwerp-verstuurd",
  "klaar-voor-akte",
  "verleden",
];
const DOSSIERTYPES: Dossiertype[] = ["verkoop-met-krediet", "verkoop-zonder-krediet"];

/** Minimaal dossier-fragment: enkel de structurele velden die de stappenmotor leest. */
function structureelDossier(
  dossiertype: Dossiertype,
  status: DossierStatus,
  vlaggen: { appartement?: boolean; kredietAanvaard?: boolean; compromisdatum?: string }
): Dossier {
  const dossier = maakLeegDossier(dossiertype, {
    id: "structureel",
    status,
    partijen: maakVeld([], "compromis"),
    ontbrekendeStukken: [],
    tegenstrijdigheden: [],
    aangemaakt: "",
    aangepast: "",
  });
  if (isVerkoopDossier(dossier)) {
    if (vlaggen.appartement) {
      dossier.goed = maakVeld({ adres: "", type: "appartement" }, "compromis");
    }
    if (vlaggen.compromisdatum) dossier.compromisdatum = maakVeld(vlaggen.compromisdatum, "compromis");
    if (dossiertype === "verkoop-met-krediet" && vlaggen.kredietAanvaard !== undefined) {
      dossier.kredietofferte = maakVeld({ bank: "", bedrag: 0, aanvaard: vlaggen.kredietAanvaard }, "kredietofferte");
    }
  }
  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, status, appartement, kredietAanvaard, compromisdatum, vandaag } = (body ?? {}) as Record<
    string,
    unknown
  >;

  if (typeof dossiertype !== "string" || !DOSSIERTYPES.includes(dossiertype as Dossiertype)) {
    return NextResponse.json(
      { fout: `'dossiertype' is verplicht: één van ${DOSSIERTYPES.join(", ")} (de stappenmotor modelleert vandaag de verkoopketen).` },
      { status: 400 }
    );
  }
  if (typeof status !== "string" || !STATUSSEN.includes(status as DossierStatus)) {
    return NextResponse.json({ fout: `'status' is verplicht: één van ${STATUSSEN.join(", ")}.` }, { status: 400 });
  }
  for (const [naam, waarde] of [["compromisdatum", compromisdatum], ["vandaag", vandaag]] as const) {
    if (waarde !== undefined && (typeof waarde !== "string" || !isIsoDatum(waarde))) {
      return NextResponse.json({ fout: `'${naam}' moet een ISO-datum 'JJJJ-MM-DD' zijn.` }, { status: 400 });
    }
  }

  const dossier = structureelDossier(dossiertype as Dossiertype, status as DossierStatus, {
    appartement: appartement === true,
    kredietAanvaard: kredietAanvaard === true ? true : kredietAanvaard === false ? false : undefined,
    compromisdatum: compromisdatum as string | undefined,
  });
  const opvolging = stelOpvolgingSamenAutonoom(dossier, (vandaag as string | undefined) ?? undefined);

  return NextResponse.json({
    huidigeStap: opvolging.huidigeStap ?? null,
    stappen: opvolging.stappen,
    // Termijnen enkel wanneer een compromisdatum werd meegegeven; anders is de
    // melding "geen compromisdatum" verwacht en geen echte onzekerheid.
    ...(compromisdatum ? { termijnen: opvolging.termijnen, onzekerheden: opvolging.onzekerheden } : {}),
    toelichting:
      "Structurele opvolgingsroute (BETA): dezelfde motor als de dossiermodule in de app. " +
      "De acties en mailcategorieën zijn generiek voor het opgegeven dossiertype/status — " +
      "dossierspecifieke acties (ontbrekende stukken, syndicus) verschijnen enkel in de app, " +
      "waar het volledige dossier lokaal beschikbaar is. De notaris valideert.",
  });
}
