import { describe, it, expect } from "vitest";
import { beoordeelAmlRisico, type AmlKenmerken } from "./aml";

// ── AUT-O6 · AML/KYC-risicomodel ─────────────────────────────────────────────

const basis: AmlKenmerken = {
  identiteitGeverifieerd: true,
  isRechtspersoon: false,
  herkomstGeldenPlausibel: true,
};

describe("beoordeelAmlRisico", () => {
  it("vrijgeven is NOOIT autonoom, ongeacht het niveau", () => {
    for (const k of [basis, { ...basis, pep: true }, { ...basis, sanctielijstHit: true }]) {
      expect(beoordeelAmlRisico(k).autonoomVrijgevenMogelijk).toBe(false);
    }
  });

  it("een sanctielijst-hit → onaanvaardbaar, geen zakenrelatie, melding overwegen (overschrijft de rest)", () => {
    const r = beoordeelAmlRisico({ ...basis, sanctielijstHit: true, identiteitGeverifieerd: false });
    expect(r.niveau).toBe("onaanvaardbaar");
    expect(r.maatregelen).toContain("geen-zakenrelatie");
    expect(r.maatregelen).toContain("melding-cfi-overwegen");
  });

  it("niet-geverifieerde identiteit → blokkerende factor + identificatie vervolledigen", () => {
    const r = beoordeelAmlRisico({ ...basis, identiteitGeverifieerd: false });
    expect(r.factoren.some((f) => f.blokkerend)).toBe(true);
    expect(r.maatregelen).toContain("identificatie-vervolledigen");
  });

  it("rechtspersoon zonder UBO → blokkerend", () => {
    const r = beoordeelAmlRisico({ ...basis, isRechtspersoon: true, uboGeidentificeerd: false });
    expect(r.factoren.some((f) => f.blokkerend)).toBe(true);
    expect(r.maatregelen).toContain("identificatie-vervolledigen");
  });

  it("rechtspersoon MET UBO en verder in orde → laag", () => {
    const r = beoordeelAmlRisico({ ...basis, isRechtspersoon: true, uboGeidentificeerd: true });
    expect(r.niveau).toBe("laag");
  });

  it("PEP → hoog + verscherpte waakzaamheid", () => {
    const r = beoordeelAmlRisico({ ...basis, pep: true });
    expect(r.niveau).toBe("hoog");
    expect(r.maatregelen).toContain("verscherpte-waakzaamheid");
  });

  it("onduidelijke herkomst der gelden → hoog", () => {
    expect(beoordeelAmlRisico({ ...basis, herkomstGeldenPlausibel: false }).niveau).toBe("hoog");
  });

  it("ongebruikelijke verrichting → hoog", () => {
    expect(beoordeelAmlRisico({ ...basis, ongebruikelijkeVerrichting: true }).niveau).toBe("hoog");
  });

  it("enkel niet-fysieke aanwezigheid → midden (verhoogd, niet hoog)", () => {
    expect(beoordeelAmlRisico({ ...basis, nietFysiekeAanwezigheid: true }).niveau).toBe("midden");
  });

  it("alles in orde → laag + standaardwaakzaamheid", () => {
    const r = beoordeelAmlRisico(basis);
    expect(r.niveau).toBe("laag");
    expect(r.maatregelen).toContain("standaard-waakzaamheid");
  });

  it("draagt altijd bijdragende factoren mee (verantwoording, geen lege lijst)", () => {
    expect(beoordeelAmlRisico(basis).factoren.length).toBeGreaterThan(0);
  });
});
