// ── Dossier → volledig autonoom werkdossier ──────────────────────────────────
// Afronding van het Einddoel: brengt de vier pijlers samen tot één
// werkdossier dat de notaris naleest en valideert:
//   1. het ontwerpdocument (stelOntwerpakteSamenAutonoom),
//   2. de modelmails (stelModelmailsSamenAutonoom),
//   3. de afrekening (stelAfrekeningSamenAutonoom),
//   4. de opvolging tot aan de ondertekening (stelOpvolgingSamenAutonoom).
//
// Pure functie, geen side effects: de aanroeper levert de bibliotheken aan
// (modellen, onderdelen, modelbrieven) en doet met het resultaat wat nodig is.
// De gecombineerde `onzekerheden` (met herkomst per pijler) geeft de notaris
// in één oogopslag alles wat nog beoordeeld of aangevuld moet worden — het
// blijft een werkdocument, nooit een afgewerkt eindresultaat.

import type { Dossier } from "./types";
import type { Gewest } from "@/lib/context/gewest";
import { stelOntwerpakteSamenAutonoom, type AutonomeOntwerpakte } from "./autonoom";
import { stelModelmailsSamenAutonoom, type AutonomeModelmails } from "./modelmails";
import { stelAfrekeningSamenAutonoom, type AutonomeAfrekening } from "./afrekening";
import { stelOpvolgingSamenAutonoom, type AutonomeOpvolging } from "./opvolging";
import type { Modeldocument, Modelonderdeel } from "@/data/modeldocumenten";
import type { Modelbrief, BriefTaal } from "@/data/modelbrieven";
import { KANTOOR, type Kantoor } from "@/data/kantoor";

/** Eén onzekerheid met aanduiding van de pijler waaruit ze komt. */
export interface WerkdossierOnzekerheid {
  pijler: "ontwerpakte" | "modelmails" | "afrekening" | "opvolging";
  boodschap: string;
  /**
   * Concrete, conservatieve suggestie om de onzekerheid op te lossen (bv. "vraag
   * dit op via een modelmail"), afgeleid uit het patroon van de boodschap.
   * Geen suggestie wanneer het patroon niet herkend wordt — dan bepaalt de
   * notaris zelf de vervolgstap (geen blinde gok, zelfde kernprincipe als bij
   * de vier pijlers zelf).
   */
  suggestie?: string;
}

/**
 * Leidt, op basis van vaste en herkenbare patronen in de boodschap, een
 * concrete vervolgstap af om de onzekerheid op te lossen. Sluit de
 * onzekerhedenlus: een onzekerheid blijft niet enkel een vlag, maar krijgt
 * — waar mogelijk — meteen een aanwijzing terug naar pijler 2 (modelmails) om
 * de ontbrekende gegevens bij de partijen op te vragen, of naar de
 * dossierpagina om ze zelf aan te vullen.
 */
function bepaalSuggestie(boodschap: string): string | undefined {
  if (/niet uit het dossier afleidbare parameters/i.test(boodschap)) {
    return "Vraag de ontbrekende gegevens op bij de partijen, bv. via een modelmail (pijler 2).";
  }
  if (/akteType niet eenduidig/i.test(boodschap)) {
    return "Bevestig het akteType met de notaris vóór je het ontwerp verder invult.";
  }
  if (/geen modelmail-categorie eenduidig|geen modelmail in de bibliotheek/i.test(boodschap)) {
    return "De notaris kiest zelf de passende correspondentie, of dien een wijzigingsvoorstel in voor een ontbrekende modelmail.";
  }
  if (/geen compromisdatum gekend|termijn van de opschortende voorwaarde.*niet gekend/i.test(boodschap)) {
    return "Vul de ontbrekende termijngegevens aan op de dossierpagina zodat de vervaldagen bewaakt kunnen worden.";
  }
  if (/verstreken op|vervalt binnen/i.test(boodschap)) {
    return "Leg dit onmiddellijk voor aan de notaris — een termijn laten verlopen kan de partijen schaden.";
  }
  if (/ontbreken nog verplichte stukken/i.test(boodschap)) {
    return "Vraag de ontbrekende stukken op, bv. via een modelmail (pijler 2), vóór de ondertekening wordt gepland.";
  }
  if (/niet gekend|geen \(positieve\)/i.test(boodschap)) {
    return "Vul het ontbrekende gegeven aan op de dossierpagina vóór je de afrekening herberekent.";
  }
  return undefined;
}

/** Het volledige autonoom samengestelde werkdossier voor één dossier. */
export interface AutonoomWerkdossier {
  ontwerpakte: AutonomeOntwerpakte;
  modelmails: AutonomeModelmails;
  afrekening: AutonomeAfrekening;
  /** Opvolging tot aan de ondertekening: termijnen, route en volgende acties. */
  opvolging: AutonomeOpvolging;
  /** Alle onzekerheden van de vier pijlers samen, met herkomst. */
  onzekerheden: WerkdossierOnzekerheid[];
}

/**
 * Stelt autonoom het volledige werkdossier samen: ontwerpdocument, modelmails
 * en afrekening, met één gecombineerde onzekerhedenlijst. De bibliotheken
 * (modellen + onderdelen voor het ontwerp, modelbrieven voor de mails) worden
 * door de aanroeper meegegeven, zodat deze functie zelf geen opslag aanspreekt.
 */
export function stelWerkdossierSamenAutonoom(
  dossier: Dossier,
  bibliotheken: {
    modellen: Modeldocument[];
    onderdelen: Modelonderdeel[];
    brieven: Modelbrief[];
  },
  gewest: Gewest,
  taal: BriefTaal = "nl",
  kantoor: Kantoor = KANTOOR,
  /**
   * Vandaag als ISO-datum ("JJJJ-MM-DD"), voor de termijnbewaking van de
   * opvolgingspijler (resterende dagen, verstreken-waarschuwingen). Zonder
   * deze parameter blijven de termijnen zelf berekend maar zonder
   * dag-tot-dag-vergelijking — de functie blijft puur en reproduceerbaar.
   */
  vandaag?: string
): AutonoomWerkdossier {
  // Documenttaal volgt de gevraagde taal (gebruikerstaal); "en" valt voor het
  // akte-ontwerp terug op "nl" (er bestaan geen Engelstalige aktemodellen).
  const documenttaal = taal === "fr" ? "fr" : "nl";
  // Brief aan de confrater: NL voor een notaris in Vlaanderen, FR in Wallonië,
  // en in Brussel de taal van het model (documenttaal).
  const confraterTaal: BriefTaal =
    gewest === "Vlaanderen" ? "nl" : gewest === "Wallonië" ? "fr" : documenttaal;
  const ontwerpakte = stelOntwerpakteSamenAutonoom(dossier, bibliotheken.modellen, bibliotheken.onderdelen, gewest, kantoor, documenttaal);
  const modelmails = stelModelmailsSamenAutonoom(dossier, bibliotheken.brieven, taal, kantoor, confraterTaal);
  const afrekening = stelAfrekeningSamenAutonoom(dossier, gewest);
  const opvolging = stelOpvolgingSamenAutonoom(dossier, vandaag);

  function metSuggestie(pijler: WerkdossierOnzekerheid["pijler"], boodschap: string): WerkdossierOnzekerheid {
    return { pijler, boodschap, suggestie: bepaalSuggestie(boodschap) };
  }

  const onzekerheden: WerkdossierOnzekerheid[] = [
    ...ontwerpakte.onzekerheden.map((boodschap) => metSuggestie("ontwerpakte", boodschap)),
    ...modelmails.onzekerheden.map((boodschap) => metSuggestie("modelmails", boodschap)),
    ...modelmails.mails.flatMap((m) =>
      m.onzekerheden.map((boodschap) => metSuggestie("modelmails", `${m.brief.titel}: ${boodschap}`))
    ),
    ...afrekening.onzekerheden.map((boodschap) => metSuggestie("afrekening", boodschap)),
    ...opvolging.onzekerheden.map((boodschap) => metSuggestie("opvolging", boodschap)),
  ];

  return { ontwerpakte, modelmails, afrekening, opvolging, onzekerheden };
}
