-- PROJ: classification-templates
-- Doku-only (siehe README.md in diesem Verzeichnis) — die tatsächliche
-- Ausführung passiert idempotent über
-- internal/storage/classification_templates.go
-- initClassificationTemplatesSchema(), aufgerufen aus (*Store).initSchema()
-- NACH initTaxonomySchema/initCustomFieldsSchema (FK auf document_types und
-- custom_field_defs).
--
-- Klassifizierungsvorlagen (classification templates): tenant-skopierte,
-- benannte Bündel aus Dokumenttyp, Tags, Custom-Field-Defaultwerten und einer
-- Aufbewahrungsdauer, die in einem Schritt auf ein Dokument angewendet werden
-- können. Bewusst KEINE persistente Kopplung template<->document (keine
-- template_id-Spalte auf documents): eine spätere Vorlagen-Änderung darf
-- Bestandsdokumente niemals rückwirkend verändern (GoBD-Nachvollziehbarkeit).
-- Die Anwendung wird ausschliesslich über einen Audit-Log-Eintrag festgehalten.
--
-- Retention-Regel (absolut, ohne Ausnahme): eine Vorlage kann retain_until nur
-- verlängern, niemals verkürzen — auch nicht mit overwrite=true. Ein
-- abgelehnter Verkürzungsversuch wird als Audit-Eintrag protokolliert.

CREATE TABLE IF NOT EXISTS classification_templates (
    id                  BIGSERIAL PRIMARY KEY,
    tenant_id           BIGINT NOT NULL,
    name                TEXT NOT NULL,
    description         TEXT,
    doc_type_id         BIGINT REFERENCES document_types(id) ON DELETE SET NULL,
    retain_years        INT,
    active              BOOLEAN NOT NULL DEFAULT true,
    created_by          BIGINT,
    created_at          TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at          TIMESTAMPTZ NOT NULL DEFAULT now(),
    UNIQUE(tenant_id, name)
);
CREATE INDEX IF NOT EXISTS idx_classification_templates_tenant ON classification_templates(tenant_id);
CREATE INDEX IF NOT EXISTS idx_classification_templates_doc_type ON classification_templates(doc_type_id);

CREATE TABLE IF NOT EXISTS classification_template_tags (
    template_id BIGINT NOT NULL REFERENCES classification_templates(id) ON DELETE CASCADE,
    tag_id      BIGINT NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
    PRIMARY KEY (template_id, tag_id)
);

CREATE TABLE IF NOT EXISTS classification_template_field_defaults (
    template_id   BIGINT NOT NULL REFERENCES classification_templates(id) ON DELETE CASCADE,
    field_id      BIGINT NOT NULL REFERENCES custom_field_defs(id) ON DELETE CASCADE,
    value_text    TEXT,
    value_number  NUMERIC,
    value_date    DATE,
    value_bool    BOOLEAN,
    overwrite     BOOLEAN NOT NULL DEFAULT false,
    PRIMARY KEY (template_id, field_id)
);
