-- Migration 039: Internal Shop system
-- Tables for catalog items, member requests, request line items, and order linking.

-- ═══════════════════════════════════════════════════════════════════════════
-- 1. Shop Artikel (Catalog Items)
-- ═══════════════════════════════════════════════════════════════════════════

CREATE TABLE IF NOT EXISTS shop_artikel (
  id                  SERIAL       PRIMARY KEY,
  bezeichnung         TEXT         NOT NULL,
  beschreibung        TEXT,
  kategorie           TEXT,
  bild_pfad           TEXT,
  geschaetzter_preis  NUMERIC(10,2),
  aktiv               BOOLEAN      NOT NULL DEFAULT TRUE,
  erstellt_von        UUID         REFERENCES users(id) ON DELETE SET NULL,
  erstellt_am         TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
  aktualisiert_am     TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_shop_artikel_kategorie ON shop_artikel(kategorie);
CREATE INDEX IF NOT EXISTS idx_shop_artikel_aktiv ON shop_artikel(aktiv);

-- ═══════════════════════════════════════════════════════════════════════════
-- 2. Shop Anfragen (Member Requests)
-- ═══════════════════════════════════════════════════════════════════════════

CREATE TABLE IF NOT EXISTS shop_anfragen (
  id              SERIAL       PRIMARY KEY,
  anfrager_id     UUID         NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  status          TEXT         NOT NULL DEFAULT 'offen'
                  CHECK (status IN ('offen','genehmigt','abgelehnt','bestellt','erledigt')),
  notizen         TEXT,
  admin_notizen   TEXT,
  bearbeitet_von  UUID         REFERENCES users(id) ON DELETE SET NULL,
  erstellt_am     TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
  aktualisiert_am TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_shop_anfragen_anfrager ON shop_anfragen(anfrager_id);
CREATE INDEX IF NOT EXISTS idx_shop_anfragen_status ON shop_anfragen(status);

-- ═══════════════════════════════════════════════════════════════════════════
-- 3. Shop Anfrage Positionen (Request Line Items)
-- ═══════════════════════════════════════════════════════════════════════════

CREATE TABLE IF NOT EXISTS shop_anfrage_positionen (
  id          SERIAL       PRIMARY KEY,
  anfrage_id  INT          NOT NULL REFERENCES shop_anfragen(id) ON DELETE CASCADE,
  artikel_id  INT          REFERENCES shop_artikel(id) ON DELETE SET NULL,
  bezeichnung TEXT         NOT NULL,
  menge       NUMERIC      NOT NULL DEFAULT 1,
  notizen     TEXT,
  erstellt_am TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS idx_shop_anfrage_positionen_anfrage ON shop_anfrage_positionen(anfrage_id);

-- ═══════════════════════════════════════════════════════════════════════════
-- 4. Shop Anfrage ↔ Bestellung Link
-- ═══════════════════════════════════════════════════════════════════════════

CREATE TABLE IF NOT EXISTS shop_anfrage_bestellung (
  anfrage_id    INT NOT NULL REFERENCES shop_anfragen(id) ON DELETE CASCADE,
  bestellung_id INT NOT NULL REFERENCES bestellungen(id) ON DELETE CASCADE,
  PRIMARY KEY (anfrage_id, bestellung_id)
);

-- ═══════════════════════════════════════════════════════════════════════════
-- 5. Auto-update triggers
-- ═══════════════════════════════════════════════════════════════════════════

DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'trg_shop_artikel_aktualisiert') THEN
    CREATE TRIGGER trg_shop_artikel_aktualisiert BEFORE UPDATE ON shop_artikel
      FOR EACH ROW EXECUTE FUNCTION update_aktualisiert_am();
  END IF;

  IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'trg_shop_anfragen_aktualisiert') THEN
    CREATE TRIGGER trg_shop_anfragen_aktualisiert BEFORE UPDATE ON shop_anfragen
      FOR EACH ROW EXECUTE FUNCTION update_aktualisiert_am();
  END IF;
END $$;
