import { describe, it, expect } from "vitest";
import { bereidDoorstortingenVoor } from "./doorstortingen-flow";
import type { Doorstorting } from "./derdengelden";

// ── Punt 36 (deel) · Doorstortingen-flow ─────────────────────────────────────

const post = (begunstigdeRef: string, bedragCent: number, reden = "uitbetaling"): Doorstorting => ({ begunstigdeRef, bedragCent, reden });

describe("bereidDoorstortingenVoor", () => {
  it("bereidt gedekte doorstortingen voor en escaleert ze (nooit autonoom)", () => {
    const r = bereidDoorstortingenVoor([post("verkoper", 380_000_00), post("kantoor", 15_000_00)], 400_000_00);
    expect(r.posten.every((p) => p.beoordeling.beslissing === "voorbereid-escaleren")).toBe(true);
    expect(r.alleGedekt).toBe(true);
    expect(r.autonoomMogelijk).toBe(false);
    expect(r.totaalVoorbereidCent).toBe(395_000_00);
    expect(r.restsaldoCent).toBe(5_000_00);
  });

  it("verlaagt het saldo sequentieel zodat de som het dossiersaldo nooit overschrijdt", () => {
    // Tweede post past niet meer op het resterende saldo.
    const r = bereidDoorstortingenVoor([post("verkoper", 300_000_00), post("bank", 150_000_00)], 400_000_00);
    expect(r.posten[0].beoordeling.beslissing).toBe("voorbereid-escaleren");
    expect(r.posten[1].beoordeling.beslissing).toBe("geweigerd");
    expect(r.alleGedekt).toBe(false);
    expect(r.restsaldoCent).toBe(100_000_00);
    expect(r.totaalVoorbereidCent).toBe(300_000_00);
  });

  it("weigert een ongeldige post zonder het saldo aan te tasten", () => {
    const r = bereidDoorstortingenVoor([post("x", 0), post("verkoper", 100_000_00)], 400_000_00);
    expect(r.posten[0].beoordeling.beslissing).toBe("geweigerd");
    expect(r.posten[1].beoordeling.beslissing).toBe("voorbereid-escaleren");
    expect(r.restsaldoCent).toBe(300_000_00);
  });

  it("blijft altijd niet-autonoom, ook bij een lege lijst", () => {
    const r = bereidDoorstortingenVoor([], 100_000_00);
    expect(r.autonoomMogelijk).toBe(false);
    expect(r.alleGedekt).toBe(true);
    expect(r.totaalVoorbereidCent).toBe(0);
    expect(r.restsaldoCent).toBe(100_000_00);
  });
});
