// ── API: termijnberekening uit structurele dossierdata (MCP) ─────────────────
// Geeft een agent de lopende wettelijke/contractuele termijnen van een
// verkoopdossier terug — de vervaldag van de opschortende voorwaarde van
// financiering en de uiterste datum van de authentieke akte — plus het
// samengevatte urgentieniveau. Uitsluitend structurele data (datums en een
// termijn in weken); nooit namen, adressen of bedragen. Hergebruikt de pure
// opvolgingsmotor (lib/dossier/opvolging.ts) met een minimaal
// Dossier-fragment, zodat MCP en app gegarandeerd dezelfde vervaldagen
// berekenen.

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

/** Minimaal verkoopdossier-fragment: enkel de velden die de termijnmotor leest. */
function structureelDossier(
  compromisdatum: string,
  krediettermijnWeken: number | undefined,
  kredietAanvaard: boolean,
  aktetermijn?: { maanden?: number; uiterlijkeDatum?: string }
): Dossier {
  const dossier = maakLeegDossier(
    krediettermijnWeken !== undefined || kredietAanvaard ? "verkoop-met-krediet" : "verkoop-zonder-krediet",
    {
      id: "structureel",
      status: "ontwerp-in-opmaak",
      partijen: maakVeld([], "compromis"),
      ontbrekendeStukken: [],
      tegenstrijdigheden: [],
      aangemaakt: "",
      aangepast: "",
    }
  );
  if (isVerkoopDossier(dossier)) {
    dossier.compromisdatum = maakVeld(compromisdatum, "compromis");
    if (aktetermijn) dossier.aktetermijn = maakVeld(aktetermijn, "compromis");
    if (dossier.dossiertype === "verkoop-met-krediet") {
      dossier.kredietofferte = maakVeld(
        { bank: "", bedrag: 0, aanvaard: kredietAanvaard, ...(krediettermijnWeken !== undefined ? { termijnWeken: krediettermijnWeken } : {}) },
        "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 { compromisdatum, krediettermijnWeken, kredietAanvaard, vandaag, aktetermijnMaanden, aktetermijnUiterlijkeDatum } = (body ?? {}) as Record<string, unknown>;

  if (typeof compromisdatum !== "string" || !isIsoDatum(compromisdatum)) {
    return NextResponse.json(
      { fout: "'compromisdatum' is verplicht en moet een ISO-datum 'JJJJ-MM-DD' zijn (de ondertekeningsdatum van de onderhandse verkoopovereenkomst)." },
      { status: 400 }
    );
  }
  if (krediettermijnWeken !== undefined && (typeof krediettermijnWeken !== "number" || krediettermijnWeken <= 0)) {
    return NextResponse.json({ fout: "'krediettermijnWeken' moet een positief getal zijn (de overeengekomen termijn van de opschortende voorwaarde, in weken)." }, { status: 400 });
  }
  if (vandaag !== undefined && (typeof vandaag !== "string" || !isIsoDatum(vandaag))) {
    return NextResponse.json({ fout: "'vandaag' moet een ISO-datum 'JJJJ-MM-DD' zijn." }, { status: 400 });
  }
  if (aktetermijnMaanden !== undefined && (typeof aktetermijnMaanden !== "number" || aktetermijnMaanden <= 0)) {
    return NextResponse.json({ fout: "'aktetermijnMaanden' moet een positief getal zijn (de contractueel bedongen aktetermijn in maanden)." }, { status: 400 });
  }
  if (aktetermijnUiterlijkeDatum !== undefined && (typeof aktetermijnUiterlijkeDatum !== "string" || !isIsoDatum(aktetermijnUiterlijkeDatum))) {
    return NextResponse.json({ fout: "'aktetermijnUiterlijkeDatum' moet een ISO-datum 'JJJJ-MM-DD' zijn (de contractueel bedongen uiterste aktedatum)." }, { status: 400 });
  }

  const aktetermijn =
    aktetermijnMaanden !== undefined || aktetermijnUiterlijkeDatum !== undefined
      ? {
          ...(aktetermijnMaanden !== undefined ? { maanden: aktetermijnMaanden as number } : {}),
          ...(aktetermijnUiterlijkeDatum !== undefined ? { uiterlijkeDatum: aktetermijnUiterlijkeDatum as string } : {}),
        }
      : undefined;
  const dossier = structureelDossier(compromisdatum, krediettermijnWeken as number | undefined, kredietAanvaard === true, aktetermijn);
  const referentiedatum = (vandaag as string | undefined) ?? new Date().toISOString().slice(0, 10);
  const opvolging = stelOpvolgingSamenAutonoom(dossier, referentiedatum);
  const urgentie = bepaalDossierUrgentie(dossier, referentiedatum);

  return NextResponse.json({
    referentiedatum,
    termijnen: opvolging.termijnen,
    urgentie,
    onzekerheden: opvolging.onzekerheden,
    toelichting:
      "Indicatieve termijnbewaking (BETA): de uiterste aktedatum is de standaardtermijn van vier maanden na het compromis (tevens de fiscale registratietermijn). Geef een afwijkende contractuele termijn mee via 'aktetermijnMaanden' of 'aktetermijnUiterlijkeDatum' — die krijgt voorrang, en ligt hij voorbij de vier maanden, dan verschijnt de fiscale registratietermijn als aparte vervaldag. De notaris valideert.",
  });
}
