-- Migration: 084_persoenliche_ausruestung
-- Creates persoenliche_ausruestung table, adds assignment columns to
-- ausruestung_anfrage_positionen, and seeds feature_group + permissions.

-- 1. Create persoenliche_ausruestung table
CREATE TABLE IF NOT EXISTS persoenliche_ausruestung (
    id                   UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    bezeichnung          TEXT NOT NULL,
    kategorie            TEXT,
    artikel_id           INT REFERENCES ausruestung_artikel(id) ON DELETE SET NULL,
    user_id              UUID REFERENCES users(id) ON DELETE SET NULL,
    benutzer_name        TEXT,
    groesse              TEXT,
    seriennummer         TEXT,
    inventarnummer       TEXT,
    anschaffung_datum    DATE,
    zustand              TEXT DEFAULT 'gut' CHECK (zustand IN ('gut','beschaedigt','abgaengig','verloren')),
    notizen              TEXT,
    anfrage_id           INT REFERENCES ausruestung_anfragen(id) ON DELETE SET NULL,
    anfrage_position_id  INT REFERENCES ausruestung_anfrage_positionen(id) ON DELETE SET NULL,
    erstellt_von         UUID REFERENCES users(id) ON DELETE SET NULL,
    erstellt_am          TIMESTAMPTZ DEFAULT NOW(),
    aktualisiert_am      TIMESTAMPTZ DEFAULT NOW(),
    geloescht_am         TIMESTAMPTZ
);

CREATE INDEX IF NOT EXISTS idx_persoenliche_ausruestung_user
    ON persoenliche_ausruestung(user_id) WHERE geloescht_am IS NULL;
CREATE INDEX IF NOT EXISTS idx_persoenliche_ausruestung_artikel
    ON persoenliche_ausruestung(artikel_id);

-- Auto-update aktualisiert_am trigger (uses the aktualisiert_am variant from migration 018)
-- DROP first to make this idempotent — previous failed migration runs may have committed the DDL
-- without recording the migration (pool.query BEGIN/ROLLBACK does not guarantee same connection).
DROP TRIGGER IF EXISTS trg_persoenliche_ausruestung_aktualisiert_am ON persoenliche_ausruestung;
CREATE TRIGGER trg_persoenliche_ausruestung_aktualisiert_am
    BEFORE UPDATE ON persoenliche_ausruestung
    FOR EACH ROW EXECUTE FUNCTION update_aktualisiert_am_column();

-- 2. Add assignment columns to ausruestung_anfrage_positionen
ALTER TABLE ausruestung_anfrage_positionen
    ADD COLUMN IF NOT EXISTS zuweisung_typ TEXT CHECK (zuweisung_typ IN ('ausruestung','persoenlich','keine'));

ALTER TABLE ausruestung_anfrage_positionen
    ADD COLUMN IF NOT EXISTS zuweisung_ausruestung_id UUID REFERENCES ausruestung(id) ON DELETE SET NULL;

ALTER TABLE ausruestung_anfrage_positionen
    ADD COLUMN IF NOT EXISTS zuweisung_persoenlich_id UUID REFERENCES persoenliche_ausruestung(id) ON DELETE SET NULL;

-- 3. Feature group + permissions
INSERT INTO feature_groups (id, label, sort_order)
VALUES ('persoenliche_ausruestung', 'Persönliche Ausrüstung', 99)
ON CONFLICT DO NOTHING;

INSERT INTO permissions (id, feature_group_id, label, description, sort_order) VALUES
    ('persoenliche_ausruestung:view',     'persoenliche_ausruestung', 'Anzeigen (eigene)',     'Eigene persönliche Ausrüstung anzeigen', 1),
    ('persoenliche_ausruestung:view_all', 'persoenliche_ausruestung', 'Anzeigen (alle)',       'Alle persönliche Ausrüstung anzeigen',   2),
    ('persoenliche_ausruestung:create',   'persoenliche_ausruestung', 'Erstellen',             'Persönliche Ausrüstung erstellen',        3),
    ('persoenliche_ausruestung:edit',     'persoenliche_ausruestung', 'Bearbeiten',            'Persönliche Ausrüstung bearbeiten',       4),
    ('persoenliche_ausruestung:delete',   'persoenliche_ausruestung', 'Löschen',               'Persönliche Ausrüstung löschen',          5)
ON CONFLICT DO NOTHING;

-- Seed permissions for groups: admin, kommandant, gruppenkommandant, zeugmeister get all; others get view only
INSERT INTO group_permissions (authentik_group, permission_id)
SELECT g.name, p.id
FROM (VALUES
    ('dashboard_admin'),
    ('dashboard_kommandant'),
    ('dashboard_gruppenkommandant'),
    ('dashboard_zeugmeister')
) AS g(name)
CROSS JOIN permissions p
WHERE p.feature_group_id = 'persoenliche_ausruestung'
ON CONFLICT DO NOTHING;

-- All other groups get view only
INSERT INTO group_permissions (authentik_group, permission_id)
SELECT g.name, 'persoenliche_ausruestung:view'
FROM (VALUES
    ('dashboard_feuerwehrmitglied'),
    ('dashboard_atemschutztraeger'),
    ('dashboard_fahrmeister'),
    ('dashboard_jugend')
) AS g(name)
ON CONFLICT DO NOTHING;
