// ── Kantoorprofiel: de multi-tenant-abstractie ───────────────────────────────
// Notary.AI draait vandaag voor één kantoor (data/kantoor.ts → KANTOOR). Deze
// laag maakt de opening naar meerdere notariskantoren mogelijk ZONDER het
// bestaande gedrag te breken: ze scheidt expliciet wat KANTOORGEBONDEN is
// (identiteit, briefhoofd/branding, bankrekeningen, sjabloon-voorkeuren) van
// wat UNIVERSEEL is (het Belgische recht: barema's, wettelijke termijnen, de
// kern van de clausulebibliotheek — nooit per kantoor).
//
// GDPR / tenant-isolatie: persoonsgegevens (dossierinhoud, partijen) blijven
// per kantoor LOKAAL (IndexedDB), net als vandaag. Serverdata wordt per tenant
// gescheiden met een niet-identificerende `KantoorprofielId` als sleutel —
// nooit met een naam of adres. `tenantSleutel` bouwt die scoping op één plaats.
//
// Deze module is de ABSTRACTIE (punt 50). Het effectief lezen van het profiel
// door voetteksten/sjablonen/briefhoofden en het beheerscherm is punt 56.

import { KANTOOR, type Kantoor } from "./kantoor";

/**
 * Niet-identificerende tenant-sleutel. Bewust een ondoorzichtige string (geen
 * kantoornaam/adres): ze scheidt serverdata per kantoor zonder persoonsgegevens
 * of kantoorgeheimen te lekken.
 */
export type KantoorprofielId = string;

/** Bankrekeningen van het kantoor — voor de afrekening/derdengelden (nooit universeel). */
export interface Kantoorrekeningen {
  /** Kwaliteits-/derdengeldenrekening (art. 34 Ventôsewet). */
  derdengelden?: string;
  /** Werkings-/kantoorrekening (erelonen, kosten). */
  kantoor?: string;
}

/** Branding voor briefhoofd en documentopmaak — puur presentatie, kantoorgebonden. */
export interface Kantoorbranding {
  /** Regels van de briefhoofding (naam, adres, telefoon, e-mail, KBO). */
  briefhoofd: string[];
  /** Vaste voettekst onder gegenereerde documenten/mails. */
  voettekst?: string;
  /** Accentkleur (hex) voor de documentopmaak; ontbreekt = de app-standaard. */
  accentkleur?: string;
}

/**
 * Kantoorgebonden sjabloon-override per akteType: verwijst naar een eigen
 * modeldocument-id dat het kantoor verkiest boven het gedeelde model. De
 * clausule-KERN blijft universeel; dit stuurt enkel de kantoorVOORKEUR.
 */
export type SjabloonVoorkeuren = Record<string, string>;

/** Eén volledig kantoorprofiel: alle kantoorgebonden gegevens onder één tenant-id. */
export interface Kantoorprofiel {
  id: KantoorprofielId;
  /** De kantooridentiteit (naam, standplaats, notarissen) — hergebruikt `Kantoor`. */
  kantoor: Kantoor;
  branding: Kantoorbranding;
  rekeningen: Kantoorrekeningen;
  /** Kantoorvoorkeur per akteType (akteType → eigen modeldocument-id). */
  sjablonen: SjabloonVoorkeuren;
  /** False = gedeactiveerd (toegang geblokkeerd) — voor tenantbeheer. */
  actief: boolean;
}

/**
 * Wat UITDRUKKELIJK universeel is en dus NOOIT in een kantoorprofiel hoort:
 * ereloon-/registratiebarema's, schenk-/erfbelastingtarieven, wettelijke
 * termijnen en de kern van de clausulebibliotheek. Deze lijst documenteert de
 * scheiding en wordt door de guard-test gebruikt om te verhinderen dat zulke
 * gegevens per tenant gedupliceerd raken.
 */
export const UNIVERSEEL_NOOIT_PER_KANTOOR = [
  "ereloonbarema",
  "registratierechten",
  "schenkbelasting",
  "erfbelasting",
  "wettelijke-termijnen",
  "clausulebibliotheek-kern",
] as const;

/** De vaste id van het standaard (huidige) kantoor — single-tenant fallback. */
export const STANDAARD_KANTOORPROFIEL_ID: KantoorprofielId = "kantoor-tervuren";

/** Bouwt het briefhoofd uit een `Kantoor` (afgeleid, zodat naam/adres op één plaats leven). */
export function briefhoofdUitKantoor(kantoor: Kantoor): string[] {
  const regels = [kantoor.naam, kantoor.zetel];
  const contact = [kantoor.telefoon && `tel. ${kantoor.telefoon}`, kantoor.email]
    .filter(Boolean)
    .join(" · ");
  if (contact) regels.push(contact);
  if (kantoor.kbo) regels.push(`KBO ${kantoor.kbo}`);
  return regels;
}

/**
 * Het standaardprofiel, afgeleid uit het bestaande `KANTOOR`. Zolang de app
 * single-tenant draait, is dit het enige profiel — niets breekt, en elke
 * consument die het profiel leest werkt meteen ook multi-tenant-klaar.
 */
export function huidigKantoorprofiel(): Kantoorprofiel {
  return {
    id: STANDAARD_KANTOORPROFIEL_ID,
    kantoor: KANTOOR,
    branding: { briefhoofd: briefhoofdUitKantoor(KANTOOR) },
    rekeningen: {},
    sjablonen: {},
    actief: true,
  };
}

/**
 * Tenant-scoping voor serverdata: prefixt een opslagsleutel met de
 * kantoorprofiel-id, zodat twee kantoren nooit elkaars serverdata zien. De
 * id is niet-identificerend; er komt geen persoonsgegeven in de sleutel.
 */
export function tenantSleutel(profielId: KantoorprofielId, sleutel: string): string {
  return `${profielId}∷${sleutel}`;
}

/** Kantoorvoorkeur-modeldocument voor een akteType, of undefined (val terug op het gedeelde model). */
export function sjabloonVoorAkteType(profiel: Kantoorprofiel, akteType: string): string | undefined {
  return profiel.sjablonen[akteType];
}
