/**
 * WIRE CONTRACT for the dashboard screen — the "BFF-lite" response.
 *
 * PURE wire shapes: this file imports NOTHING (CLAUDE.md §1, ADR-0001). Enums are
 * inlined string-literal unions that describe the wire, not the domain. The
 * adapter's `parseDashboardView` validates this untrusted shape and MAPS it onto
 * the FE domain model (Registration/Person/BigProfile) — that map is the
 * decoupling seam: the wire can change without the domain following.
 *
 * In production these types are GENERATED from the OpenAPI/TypeSpec spec (one
 * source of truth for both sides), and the `decisions` block is computed BY THE
 * BACKEND — never recomputed on the client. The frontend renders decisions; it
 * does not own the rules. See docs/architecture/0001-bff-lite-decision-dtos.md.
 *
 * One screen-shaped call replaces the previous three (BIG-register + BRP + …),
 * so the page always sees one consistent snapshot instead of three independently
 * loading/erroring resources.
 */

/** Registration status on the wire: the discriminant tags as they arrive. */
export type RegistrationStatusDto =
  | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date
  | { tag: 'Geschorst'; geschorstTot: string; reden: string }
  | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };

export interface RegistrationDto {
  bigNummer: string;
  naam: string;
  beroep: string;
  registratiedatum: string; // ISO date
  geboortedatum: string;
  status: RegistrationStatusDto;
}

export interface AdresDto {
  straat: string;
  postcode: string;
  woonplaats: string;
}

export interface PersonDto {
  naam: string;
  geboortedatum: string; // ISO date
  adres: AdresDto;
}

/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):
    the eligibility rule lives on the backend; the optional reason lets the UI
    explain itself without knowing the rule. */
export interface HerregistratieDecisions {
  eligibleForHerregistratie: boolean;
  herregistratieReason?: string;
}

export interface DashboardViewDto {
  registration: RegistrationDto;
  person: PersonDto;
  decisions: HerregistratieDecisions;
}
