-- ============================================================
-- Skeelera — Batch fonctionnalités (langues, capacité groupe,
--             coordonnées client, audit logs, codes promo,
--             avertissements prestataires)
-- ============================================================

-- ─── 1. Langues parlées sur les vitrines ─────────────────────
ALTER TABLE vitrines
  ADD COLUMN IF NOT EXISTS langues TEXT[] NOT NULL DEFAULT '{}';

-- ─── 2. Capacité groupe sur les prestations ──────────────────
ALTER TABLE prestations
  ADD COLUMN IF NOT EXISTS capacite_groupe INTEGER;
-- Utilisé quand type_prestation = 'groupe_programme'

-- ─── 3. Adresse et coordonnées client (utilisateurs) ─────────
ALTER TABLE utilisateurs
  ADD COLUMN IF NOT EXISTS adresse    TEXT,
  ADD COLUMN IF NOT EXISTS latitude   DOUBLE PRECISION,
  ADD COLUMN IF NOT EXISTS longitude  DOUBLE PRECISION;

-- ─── 4. Table audit_logs ─────────────────────────────────────
CREATE TABLE IF NOT EXISTS audit_logs (
  id          UUID        PRIMARY KEY DEFAULT gen_random_uuid(),
  action      TEXT        NOT NULL,
  user_id     UUID        REFERENCES utilisateurs(id) ON DELETE SET NULL,
  target_id   TEXT,
  target_type TEXT,
  ip          TEXT,
  details     JSONB,
  created_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS audit_logs_user_idx     ON audit_logs (user_id);
CREATE INDEX IF NOT EXISTS audit_logs_action_idx   ON audit_logs (action);
CREATE INDEX IF NOT EXISTS audit_logs_created_idx  ON audit_logs (created_at DESC);

-- RLS audit_logs : lecture admin seulement
ALTER TABLE audit_logs ENABLE ROW LEVEL SECURITY;

CREATE POLICY audit_logs_admin_select ON audit_logs
  FOR SELECT
  USING (
    EXISTS (
      SELECT 1 FROM utilisateurs u
      WHERE u.id = auth.uid()
        AND 'admin' = ANY(u.roles)
    )
  );

-- ─── 5. Table codes_promo ─────────────────────────────────────
CREATE TABLE IF NOT EXISTS codes_promo (
  id                  UUID        PRIMARY KEY DEFAULT gen_random_uuid(),
  code                TEXT        NOT NULL UNIQUE,
  description         TEXT,
  type                TEXT        NOT NULL DEFAULT 'percent',  -- 'percent' | 'fixed'
  valeur              NUMERIC(10,2) NOT NULL,
  stripe_coupon_id    TEXT,
  abonnement_id       UUID        REFERENCES abonnements(id) ON DELETE SET NULL,
  max_utilisations    INTEGER,
  utilisations_count  INTEGER     NOT NULL DEFAULT 0,
  actif               BOOLEAN     NOT NULL DEFAULT true,
  date_expiration     TIMESTAMPTZ,
  created_at          TIMESTAMPTZ NOT NULL DEFAULT now(),
  updated_at          TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS codes_promo_code_idx ON codes_promo (code);
CREATE INDEX IF NOT EXISTS codes_promo_actif_idx ON codes_promo (actif);

ALTER TABLE codes_promo ENABLE ROW LEVEL SECURITY;

CREATE POLICY codes_promo_admin_all ON codes_promo
  FOR ALL
  USING (
    EXISTS (
      SELECT 1 FROM utilisateurs u
      WHERE u.id = auth.uid()
        AND 'admin' = ANY(u.roles)
    )
  );

-- ─── 6. Table prestataire_avertissements ─────────────────────
CREATE TABLE IF NOT EXISTS prestataire_avertissements (
  id              UUID        PRIMARY KEY DEFAULT gen_random_uuid(),
  prestataire_id  UUID        NOT NULL REFERENCES prestataires(id) ON DELETE CASCADE,
  admin_id        UUID        REFERENCES utilisateurs(id) ON DELETE SET NULL,
  motif           TEXT        NOT NULL,
  message         TEXT,
  type            TEXT        NOT NULL DEFAULT 'avertissement',  -- 'avertissement' | 'mise_en_demeure' | 'suspension'
  lu              BOOLEAN     NOT NULL DEFAULT false,
  created_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX IF NOT EXISTS prestataire_avertissements_prestataire_idx
  ON prestataire_avertissements (prestataire_id);

ALTER TABLE prestataire_avertissements ENABLE ROW LEVEL SECURITY;

CREATE POLICY avertissements_admin_all ON prestataire_avertissements
  FOR ALL
  USING (
    EXISTS (
      SELECT 1 FROM utilisateurs u
      WHERE u.id = auth.uid()
        AND 'admin' = ANY(u.roles)
    )
  );

CREATE POLICY avertissements_prestataire_select ON prestataire_avertissements
  FOR SELECT
  USING (
    prestataire_id IN (
      SELECT id FROM prestataires WHERE utilisateur_id = auth.uid()
    )
  );
