-- Migration 007: Authentik groups + vehicle inspection/service periods
-- Depends on: 001_create_users_table.sql, 005_create_fahrzeuge.sql
--
-- Changes:
--   1. Add authentik_groups column to users (stores Authentik group memberships)
--   2. Add paragraph57a_faellig_am + naechste_wartung_am to fahrzeuge
--   3. Refresh the fahrzeuge_mit_pruefstatus view to expose the new columns
-- Rollback:
--   ALTER TABLE users DROP COLUMN IF EXISTS authentik_groups;
--   ALTER TABLE fahrzeuge DROP COLUMN IF EXISTS paragraph57a_faellig_am;
--   ALTER TABLE fahrzeuge DROP COLUMN IF EXISTS naechste_wartung_am;

-- ── 1. users: Authentik group memberships ─────────────────────────────────────
ALTER TABLE users
    ADD COLUMN IF NOT EXISTS authentik_groups TEXT[] NOT NULL DEFAULT '{}';

COMMENT ON COLUMN users.authentik_groups IS
    'Authentik group slugs synced on every login (e.g. dashboard_admin, fahrmeister)';

-- ── 2. fahrzeuge: §57a (Austrian periodic inspection) + service interval ──────
ALTER TABLE fahrzeuge
    ADD COLUMN IF NOT EXISTS paragraph57a_faellig_am DATE;

COMMENT ON COLUMN fahrzeuge.paragraph57a_faellig_am IS
    '§57a StVO periodic inspection due date (Austrian equivalent of HU/TÜV)';

ALTER TABLE fahrzeuge
    ADD COLUMN IF NOT EXISTS naechste_wartung_am DATE;

COMMENT ON COLUMN fahrzeuge.naechste_wartung_am IS
    'Next scheduled service / maintenance due date';

-- ── 3. Refresh view to expose new vehicle columns ─────────────────────────────
-- Drop and recreate since CREATE OR REPLACE on views requires identical column list.
DROP VIEW IF EXISTS fahrzeuge_mit_pruefstatus;

CREATE OR REPLACE VIEW fahrzeuge_mit_pruefstatus AS
WITH latest_pruefungen AS (
    SELECT DISTINCT ON (fahrzeug_id, pruefung_art)
        fahrzeug_id,
        pruefung_art,
        id              AS pruefung_id,
        faellig_am,
        durchgefuehrt_am,
        ergebnis,
        naechste_faelligkeit,
        pruefende_stelle,
        CURRENT_DATE - faellig_am::date AS tage_ueberfaellig,
        faellig_am::date - CURRENT_DATE AS tage_bis_faelligkeit
    FROM fahrzeug_pruefungen
    ORDER BY
        fahrzeug_id,
        pruefung_art,
        (durchgefuehrt_am IS NULL) DESC,
        faellig_am DESC
)
SELECT
    f.id,
    f.bezeichnung,
    f.kurzname,
    f.amtliches_kennzeichen,
    f.fahrgestellnummer,
    f.baujahr,
    f.hersteller,
    f.typ_schluessel,
    f.besatzung_soll,
    f.status,
    f.status_bemerkung,
    f.standort,
    f.bild_url,
    f.created_at,
    f.updated_at,
    -- §57a Austrian periodic inspection
    f.paragraph57a_faellig_am,
    f.paragraph57a_faellig_am::date - CURRENT_DATE AS paragraph57a_tage_bis_faelligkeit,
    -- Next service/maintenance
    f.naechste_wartung_am,
    f.naechste_wartung_am::date - CURRENT_DATE   AS wartung_tage_bis_faelligkeit,
    -- Legacy pruefungen (HU / AU / UVV / Leiter) kept for backwards compat
    hu.pruefung_id   AS hu_pruefung_id,
    hu.faellig_am    AS hu_faellig_am,
    hu.tage_bis_faelligkeit AS hu_tage_bis_faelligkeit,
    hu.ergebnis      AS hu_ergebnis,
    au.pruefung_id   AS au_pruefung_id,
    au.faellig_am    AS au_faellig_am,
    au.tage_bis_faelligkeit AS au_tage_bis_faelligkeit,
    au.ergebnis      AS au_ergebnis,
    uvv.pruefung_id  AS uvv_pruefung_id,
    uvv.faellig_am   AS uvv_faellig_am,
    uvv.tage_bis_faelligkeit AS uvv_tage_bis_faelligkeit,
    uvv.ergebnis     AS uvv_ergebnis,
    leiter.pruefung_id AS leiter_pruefung_id,
    leiter.faellig_am  AS leiter_faellig_am,
    leiter.tage_bis_faelligkeit AS leiter_tage_bis_faelligkeit,
    leiter.ergebnis    AS leiter_ergebnis,
    -- Overall worst urgency: §57a + Wartung take precedence, legacy pruefungen kept
    LEAST(
        f.paragraph57a_faellig_am::date - CURRENT_DATE,
        f.naechste_wartung_am::date     - CURRENT_DATE,
        hu.tage_bis_faelligkeit,
        au.tage_bis_faelligkeit,
        uvv.tage_bis_faelligkeit,
        leiter.tage_bis_faelligkeit
    ) AS naechste_pruefung_tage
FROM
    fahrzeuge f
    LEFT JOIN latest_pruefungen hu     ON hu.fahrzeug_id = f.id  AND hu.pruefung_art = 'HU'
    LEFT JOIN latest_pruefungen au     ON au.fahrzeug_id = f.id  AND au.pruefung_art = 'AU'
    LEFT JOIN latest_pruefungen uvv    ON uvv.fahrzeug_id = f.id AND uvv.pruefung_art = 'UVV'
    LEFT JOIN latest_pruefungen leiter ON leiter.fahrzeug_id = f.id AND leiter.pruefung_art = 'Leiter';
