// ── Punt 36 (deel) · Doorstortingen-flow — tier-3-escalatielijst (laag 6) ─────
// Ná de akte en de afrekening staan er doorstortingen klaar vanuit de
// derdenrekening (netto-verkoopprijs naar de verkoper, saldo's, honoraria, …).
// Geld verplaatsen is tier-3 met hoge impact: het wordt NOOIT autonoom
// uitgevoerd (AUT-O7). Deze flow bereidt de doorstortingen voor en levert ze op
// als één escalatielijst die de notaris per post goedkeurt — analoog aan de
// opzoekingen-/formaliteiten-flows, maar dan voor geld.
//
// ── Ontwerpbeslissingen ─────────────────────────────────────────────────────
// 1. NOOIT AUTONOOM. Elke post gaat via `beoordeelDoorstorting` (AUT-O7); het
//    resultaat is per definitie "voorbereid-escaleren" of "geweigerd", nooit een
//    uitvoering. De aggregatie draagt `autonoomMogelijk: false`.
// 2. SEQUENTIEEL SALDO — DE REKENING MAG NOOIT IN HET ROOD. De posten worden op
//    volgorde tegen een lopend saldo beoordeeld; een gedekte post verlaagt het
//    beschikbare saldo voor de volgende. Zo kan de som van de doorstortingen het
//    dossiersaldo nooit overschrijden (de kernwaarborg van de derdenrekening).
// 3. VERANTWOORDBAAR. Elke post draagt haar beoordeling + reden mee (audit-trail,
//    AUT-O2); geen persoonsgegevens (begunstigde via pseudoniem/omschrijving).

import {
  beoordeelDoorstorting,
  type Doorstorting,
  type DoorstortingBeoordeling,
} from "./derdengelden";

/** Eén voorbereide doorstorting mét haar beoordeling. */
export interface VoorbereideDoorstorting {
  doorstorting: Doorstorting;
  beoordeling: DoorstortingBeoordeling;
}

/** De volledige, ter goedkeuring voorgelegde doorstortingslijst van een dossier. */
export interface DoorstortingenEscalatielijst {
  posten: VoorbereideDoorstorting[];
  /** Som van de gedekte, voorbereide doorstortingen (eurocent). */
  totaalVoorbereidCent: number;
  /** Resterend beschikbaar saldo na de voorbereide doorstortingen (eurocent). */
  restsaldoCent: number;
  /** Zijn alle voorgenomen doorstortingen door het saldo gedekt? */
  alleGedekt: boolean;
  /** ALTIJD false: doorstorten is nooit autonoom (AUT-O7). */
  autonoomMogelijk: false;
}

/**
 * Bereidt een reeks voorgenomen doorstortingen voor tegen het beschikbare
 * dossiersaldo (eurocent). De posten worden sequentieel beoordeeld: elke
 * gedekte, voorbereide doorstorting verlaagt het lopende saldo, zodat de som
 * nooit het dossiersaldo overschrijdt. Puur; het resultaat is een escalatielijst
 * voor de notaris — er wordt niets uitgevoerd.
 */
export function bereidDoorstortingenVoor(
  doorstortingen: readonly Doorstorting[],
  beschikbaarSaldoCent: number
): DoorstortingenEscalatielijst {
  const posten: VoorbereideDoorstorting[] = [];
  let saldo = beschikbaarSaldoCent;
  let totaalVoorbereidCent = 0;

  for (const doorstorting of doorstortingen) {
    const beoordeling = beoordeelDoorstorting(doorstorting, saldo);
    if (beoordeling.beslissing === "voorbereid-escaleren") {
      saldo -= doorstorting.bedragCent;
      totaalVoorbereidCent += doorstorting.bedragCent;
    }
    posten.push({ doorstorting, beoordeling });
  }

  return {
    posten,
    totaalVoorbereidCent,
    restsaldoCent: saldo,
    alleGedekt: posten.every((p) => p.beoordeling.beslissing === "voorbereid-escaleren"),
    autonoomMogelijk: false,
  };
}
