-- Migration 071: Checklisten Equipment Extensions
-- Extends the checklist system to support equipment (Ausruestung) alongside vehicles.
-- Depends on: 068_checklisten.sql, 070_ausruestung_typen.sql

-- ═══════════════════════════════════════════════════════════════════════════
-- 1. Extend checklist_vorlagen with direct assignment columns
-- ═══════════════════════════════════════════════════════════════════════════

ALTER TABLE checklist_vorlagen
  ADD COLUMN IF NOT EXISTS fahrzeug_id UUID REFERENCES fahrzeuge(id) ON DELETE SET NULL;

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

ALTER TABLE checklist_vorlagen
  ADD COLUMN IF NOT EXISTS ausruestung_typ_id INT REFERENCES ausruestung_typen(id) ON DELETE SET NULL;

CREATE INDEX IF NOT EXISTS idx_cv_fahrzeug_id ON checklist_vorlagen(fahrzeug_id);
CREATE INDEX IF NOT EXISTS idx_cv_ausruestung_id ON checklist_vorlagen(ausruestung_id);
CREATE INDEX IF NOT EXISTS idx_cv_ausruestung_typ_id ON checklist_vorlagen(ausruestung_typ_id);

-- ═══════════════════════════════════════════════════════════════════════════
-- 2. Extend checklist_ausfuehrungen with ausruestung support
-- ═══════════════════════════════════════════════════════════════════════════

-- Make fahrzeug_id nullable (was NOT NULL; now either fahrzeug or ausruestung)
ALTER TABLE checklist_ausfuehrungen
  ALTER COLUMN fahrzeug_id DROP NOT NULL;

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

CREATE INDEX IF NOT EXISTS idx_ca_ausruestung_id ON checklist_ausfuehrungen(ausruestung_id);

-- ═══════════════════════════════════════════════════════════════════════════
-- 3. Extend checklist_faelligkeit with ausruestung support
-- ═══════════════════════════════════════════════════════════════════════════

-- Make fahrzeug_id nullable (was part of composite PK)
ALTER TABLE checklist_faelligkeit
  DROP CONSTRAINT IF EXISTS checklist_faelligkeit_pkey;

ALTER TABLE checklist_faelligkeit
  ALTER COLUMN fahrzeug_id DROP NOT NULL;

ALTER TABLE checklist_faelligkeit
  ADD COLUMN IF NOT EXISTS ausruestung_id UUID REFERENCES ausruestung(id) ON DELETE CASCADE;

-- Use partial unique indexes instead of UNIQUE NULLS NOT DISTINCT (compatible with PG < 15)
CREATE UNIQUE INDEX IF NOT EXISTS idx_cf_fahrzeug_vorlage
  ON checklist_faelligkeit (vorlage_id, fahrzeug_id)
  WHERE fahrzeug_id IS NOT NULL AND ausruestung_id IS NULL;

CREATE UNIQUE INDEX IF NOT EXISTS idx_cf_ausruestung_vorlage
  ON checklist_faelligkeit (vorlage_id, ausruestung_id)
  WHERE ausruestung_id IS NOT NULL AND fahrzeug_id IS NULL;

CREATE INDEX IF NOT EXISTS idx_cf_ausruestung_id ON checklist_faelligkeit(ausruestung_id);

-- ═══════════════════════════════════════════════════════════════════════════
-- 4. Ausruestung-spezifische Checklist Items
-- ═══════════════════════════════════════════════════════════════════════════

CREATE TABLE IF NOT EXISTS ausruestung_checklist_items (
  id              SERIAL       PRIMARY KEY,
  ausruestung_id  UUID         NOT NULL REFERENCES ausruestung(id) ON DELETE CASCADE,
  bezeichnung     VARCHAR(500) NOT NULL,
  beschreibung    TEXT,
  pflicht         BOOLEAN      NOT NULL DEFAULT TRUE,
  sort_order      INT          NOT NULL DEFAULT 0,
  aktiv           BOOLEAN      NOT NULL DEFAULT TRUE,
  created_at      TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_aci_ausruestung_id ON ausruestung_checklist_items(ausruestung_id);

-- ═══════════════════════════════════════════════════════════════════════════
-- 5. Extend checklist_ausfuehrung_items to reference ausruestung items
-- ═══════════════════════════════════════════════════════════════════════════

ALTER TABLE checklist_ausfuehrung_items
  ADD COLUMN IF NOT EXISTS ausruestung_item_id INT REFERENCES ausruestung_checklist_items(id) ON DELETE SET NULL;
