BEGIN;

-- Organisationseinheiten (OEs): Baum pro Organisation, ein Geraet gehoert zu
-- genau einer OE. "Neue Geraete" ist pro Organisation die einzige Zeile mit
-- ist_standard=true - Landeplatz fuer neu aktivierte Geraete, geschuetzt vor
-- Loeschen (siehe app.py). parent_id = NULL heisst "oberste Ebene direkt
-- unter der Organisation" - kein eigener Wurzel-Datensatz noetig, die
-- Organisation selbst ist implizit die Wurzel.
CREATE TABLE organisationseinheiten (
    id UUID PRIMARY KEY,
    organization_id UUID NOT NULL
        REFERENCES organizations(id)
        ON DELETE CASCADE,
    parent_id UUID
        REFERENCES organisationseinheiten(id)
        ON DELETE RESTRICT,
    name TEXT NOT NULL,
    ist_standard BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (organization_id, parent_id, name)
);

CREATE UNIQUE INDEX organisationseinheiten_one_standard_per_org
    ON organisationseinheiten (organization_id)
    WHERE ist_standard;

-- Nullable hier: bestehende Geraete brauchen erst einen Backfill
-- (scripts/backfill_organisationseinheiten.py), bevor NOT NULL erzwungen
-- werden kann (siehe Migration 0019).
ALTER TABLE devices ADD COLUMN oe_id UUID
    REFERENCES organisationseinheiten(id)
    ON DELETE RESTRICT;

-- Gruppen: flach (keine Verschachtelung), ein Geraet kann in mehreren
-- gleichzeitig sein (device_gruppen als M:N).
CREATE TABLE gruppen (
    id UUID PRIMARY KEY,
    organization_id UUID NOT NULL
        REFERENCES organizations(id)
        ON DELETE CASCADE,
    name TEXT NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (organization_id, name)
);

CREATE TABLE device_gruppen (
    device_id UUID NOT NULL
        REFERENCES devices(id)
        ON DELETE CASCADE,
    gruppe_id UUID NOT NULL
        REFERENCES gruppen(id)
        ON DELETE CASCADE,
    PRIMARY KEY (device_id, gruppe_id)
);

-- Sparsame Merkmal-Overrides je OE/Gruppe, gleiches Muster wie
-- device_merkmale (0007_auftragskatalog.sql): nur eine Zeile, wenn diese
-- OE/Gruppe tatsaechlich eine explizite Meinung zu diesem Merkmal hat.
CREATE TABLE oe_merkmale (
    oe_id UUID NOT NULL
        REFERENCES organisationseinheiten(id)
        ON DELETE CASCADE,
    merkmal_id UUID NOT NULL
        REFERENCES merkmale(id)
        ON DELETE RESTRICT,
    aktiv BOOLEAN NOT NULL,
    optionen JSONB NOT NULL DEFAULT '{}'::jsonb,
    PRIMARY KEY (oe_id, merkmal_id)
);

CREATE TABLE gruppen_merkmale (
    gruppe_id UUID NOT NULL
        REFERENCES gruppen(id)
        ON DELETE CASCADE,
    merkmal_id UUID NOT NULL
        REFERENCES merkmale(id)
        ON DELETE RESTRICT,
    aktiv BOOLEAN NOT NULL,
    optionen JSONB NOT NULL DEFAULT '{}'::jsonb,
    PRIMARY KEY (gruppe_id, merkmal_id)
);

COMMIT;
