import { describe, it, expect } from "vitest";
import { bepaalOpenstaandeStappen, beoordeelPartijAml, beoordeelDossierAml } from "./aml-flow";
import type { AmlKenmerken } from "./aml";

// ── AUT-S5 · AML/KYC-flow ────────────────────────────────────────────────────

const volledigSchoon: AmlKenmerken = {
  identiteitGeverifieerd: true,
  isRechtspersoon: false,
  sanctielijstHit: false,
  pep: false,
  herkomstGeldenPlausibel: true,
};

describe("bepaalOpenstaandeStappen — screening-status ≠ resultaat", () => {
  it("markeert een niet-uitgevoerde screening als openstaande stap (undefined ≠ ok)", () => {
    const stappen = bepaalOpenstaandeStappen({ identiteitGeverifieerd: true, isRechtspersoon: false });
    const codes = stappen.map((s) => s.code);
    expect(codes).toContain("sanctie-screening");
    expect(codes).toContain("pep-screening");
    expect(codes).toContain("herkomst-gelden");
  });

  it("geeft geen openstaande stappen bij een volledig gescreende partij", () => {
    expect(bepaalOpenstaandeStappen(volledigSchoon)).toEqual([]);
  });

  it("vraagt UBO enkel bij een rechtspersoon", () => {
    expect(bepaalOpenstaandeStappen({ identiteitGeverifieerd: true, isRechtspersoon: false }).some((s) => s.code === "ubo")).toBe(false);
    expect(
      bepaalOpenstaandeStappen({ identiteitGeverifieerd: true, isRechtspersoon: true, sanctielijstHit: false, pep: false, herkomstGeldenPlausibel: true }).some((s) => s.code === "ubo")
    ).toBe(true);
  });
});

describe("beoordeelPartijAml", () => {
  it("combineert het AUT-O6-risico met de openstaande stappen", () => {
    const r = beoordeelPartijAml("verkoper", volledigSchoon);
    expect(r.beoordeling.niveau).toBe("laag");
    expect(r.beoordeling.autonoomVrijgevenMogelijk).toBe(false);
    expect(r.openstaandeStappen).toEqual([]);
  });
});

describe("beoordeelDossierAml — aggregatie + escalatie", () => {
  it("neemt het hoogste risiconiveau over de partijen en escaleert altijd", () => {
    const r = beoordeelDossierAml([
      { ref: "verkoper", kenmerken: volledigSchoon },
      { ref: "koper", kenmerken: { ...volledigSchoon, pep: true } },
    ]);
    expect(r.hoogsteNiveau).toBe("hoog");
    expect(r.besluit).toBe("voorleggen-notaris");
    expect(r.autonoomVrijgevenMogelijk).toBe(false);
  });

  it("is blokkerend bij een sanctie-hit (onaanvaardbaar) met blokkerende grond", () => {
    const r = beoordeelDossierAml([{ ref: "koper", kenmerken: { ...volledigSchoon, sanctielijstHit: true } }]);
    expect(r.hoogsteNiveau).toBe("onaanvaardbaar");
    expect(r.blokkerend).toBe(true);
    expect(r.gronden.some((g) => g.blokkerend && !g.positief)).toBe(true);
  });

  it("is blokkerend zolang een verplichte controle nog openstaat", () => {
    const r = beoordeelDossierAml([{ ref: "koper", kenmerken: { identiteitGeverifieerd: false, isRechtspersoon: false } }]);
    expect(r.blokkerend).toBe(true);
    expect(r.gronden.some((g) => g.omschrijving.includes("identiteit") || g.omschrijving.includes("sanctie-screening"))).toBe(true);
  });

  it("geeft een positieve grond bij een volledig schoon dossier maar blijft escaleren", () => {
    const r = beoordeelDossierAml([{ ref: "verkoper", kenmerken: volledigSchoon }]);
    expect(r.blokkerend).toBe(false);
    expect(r.gronden).toEqual([expect.objectContaining({ positief: true })]);
    expect(r.besluit).toBe("voorleggen-notaris");
  });

  it("houdt de gronden PII-vrij (enkel rol/aard, geen namen of waarden)", () => {
    const r = beoordeelDossierAml([{ ref: "koper", kenmerken: { ...volledigSchoon, sanctielijstHit: true } }]);
    expect(r.gronden.map((g) => g.omschrijving).join(" ")).not.toMatch(/\d{2}\.\d{2}\.\d{2}/);
  });
});
