import { describe, it, expect } from "vitest";
import { KANTOOR } from "./kantoor";
import {
  huidigKantoorprofiel,
  briefhoofdUitKantoor,
  tenantSleutel,
  sjabloonVoorAkteType,
  UNIVERSEEL_NOOIT_PER_KANTOOR,
  STANDAARD_KANTOORPROFIEL_ID,
  type Kantoorprofiel,
} from "./kantoorprofiel";

describe("huidigKantoorprofiel", () => {
  it("leidt het standaardprofiel af uit KANTOOR zonder de identiteit te dupliceren", () => {
    const profiel = huidigKantoorprofiel();
    expect(profiel.id).toBe(STANDAARD_KANTOORPROFIEL_ID);
    expect(profiel.kantoor).toBe(KANTOOR); // zelfde bron, geen kopie
    expect(profiel.actief).toBe(true);
    expect(profiel.branding.briefhoofd[0]).toBe(KANTOOR.naam);
  });
});

describe("briefhoofdUitKantoor", () => {
  it("bouwt het briefhoofd op uit de kantoorvelden", () => {
    const regels = briefhoofdUitKantoor({
      naam: "Test & Partners",
      standplaats: "Tervuren",
      zetel: "3080 Tervuren, Broekstraat 25",
      telefoon: "02/000.00.00",
      email: "info@test.be",
      kbo: "0123.456.789",
      notarissen: ["Test"],
      standaardNotaris: "Test",
    });
    expect(regels[0]).toBe("Test & Partners");
    expect(regels).toContain("3080 Tervuren, Broekstraat 25");
    expect(regels.some((r) => r.includes("tel. 02/000.00.00") && r.includes("info@test.be"))).toBe(true);
    expect(regels).toContain("KBO 0123.456.789");
  });
});

describe("tenant-isolatie", () => {
  it("scheidt serverdata per profiel-id, zonder persoonsgegevens in de sleutel", () => {
    const a = tenantSleutel("kantoor-a", "voorstellen");
    const b = tenantSleutel("kantoor-b", "voorstellen");
    expect(a).not.toBe(b);
    expect(a).toContain("kantoor-a");
    // de sleutel bevat enkel de niet-identificerende id + het datatype
    expect(a).toBe("kantoor-a∷voorstellen");
  });
});

describe("sjabloonVoorAkteType", () => {
  it("geeft de kantoorvoorkeur of undefined (val terug op het gedeelde model)", () => {
    const profiel: Kantoorprofiel = {
      ...huidigKantoorprofiel(),
      sjablonen: { verkoopakte: "eigen-verkoopakte-tervuren" },
    };
    expect(sjabloonVoorAkteType(profiel, "verkoopakte")).toBe("eigen-verkoopakte-tervuren");
    expect(sjabloonVoorAkteType(profiel, "schenkingsakte")).toBeUndefined();
  });
});

describe("scheiding kantoorgebonden ↔ universeel", () => {
  it("universele domeinen staan niet in het kantoorprofiel (geen per-tenant duplicatie)", () => {
    const profiel = huidigKantoorprofiel();
    const profielSleutels = Object.keys(profiel);
    for (const universeel of UNIVERSEEL_NOOIT_PER_KANTOOR) {
      expect(profielSleutels).not.toContain(universeel);
    }
    // Het profiel draagt uitsluitend kantoorgebonden velden.
    expect(profielSleutels.sort()).toEqual(
      ["actief", "branding", "id", "kantoor", "rekeningen", "sjablonen"].sort()
    );
  });
});
