-- RET-01: generisches Retention-Objektmodell. Modulübergreifend über
-- Adapter (object_type/object_reference als reine Textfelder, KEINE
-- Fremdschlüssel auf DMS-/Mail-Tabellen) — Archive kennt die
-- Fachobjekte anderer Module nicht, nur deren Typ+Referenz.
CREATE TABLE IF NOT EXISTS retention_objects (
    id               UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    object_type      TEXT NOT NULL,
    object_reference TEXT NOT NULL,
    status           TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'expired', 'deleted')),
    created_at       TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE (object_type, object_reference)
);

-- Historisiert: JEDE Zuordnung ist eine eigene, unveränderliche Zeile
-- (nie UPDATE) — "aktuelle" Aufbewahrungsklasse ist die mit dem
-- jüngsten assigned_at je retention_object_id. So bleibt nachvollziehbar,
-- wann sich die Klasse eines Objekts geändert hat (Akzeptanzkriterium 2).
CREATE TABLE IF NOT EXISTS retention_class_assignments (
    id                   UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    retention_object_id  UUID NOT NULL REFERENCES retention_objects(id) ON DELETE CASCADE,
    retention_class      TEXT NOT NULL,
    assigned_at          TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS idx_retention_class_assignments_object
    ON retention_class_assignments (retention_object_id, assigned_at DESC);
