-- =============================================================================
-- 05_airports_zones.sql — gestion manuelle des zones d'exclusion
--
-- Étend adsb.airports pour accueillir, à côté des aérodromes de référence, des
-- zones ajoutées à la main depuis l'interface (typiquement une zone découverte
-- par l'analyse et que l'on souhaite écarter des recherches suivantes).
--
-- Idempotent : peut être relancé sans risque.
--
-- Usage :
--   docker exec -i wordpress-postgres psql -U pgz_admin -d wpz_postgres \
--     -v ON_ERROR_STOP=1 < 05_airports_zones.sql
-- =============================================================================

\set ON_ERROR_STOP on

-- Origine de la fiche : distingue ce qui vient du référentiel de ce que
-- l'utilisateur a ajouté. Permet de réinitialiser les aérodromes sans perdre
-- les zones personnelles, et inversement.
ALTER TABLE adsb.airports
  ADD COLUMN IF NOT EXISTS source text NOT NULL DEFAULT 'reference';

ALTER TABLE adsb.airports
  ADD COLUMN IF NOT EXISTS cree_le timestamptz NOT NULL DEFAULT now();

ALTER TABLE adsb.airports
  ADD COLUMN IF NOT EXISTS modifie_le timestamptz NOT NULL DEFAULT now();

-- Contrainte de valeurs, ajoutée seulement si absente
DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'airports_source_chk') THEN
    ALTER TABLE adsb.airports
      ADD CONSTRAINT airports_source_chk
      CHECK (source IN ('reference', 'manuelle'));
  END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'airports_rayon_chk') THEN
    ALTER TABLE adsb.airports
      ADD CONSTRAINT airports_rayon_chk
      CHECK (rayon_km > 0 AND rayon_km <= 100);
  END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'airports_coord_chk') THEN
    ALTER TABLE adsb.airports
      ADD CONSTRAINT airports_coord_chk
      CHECK (lat BETWEEN -90 AND 90 AND lon BETWEEN -180 AND 180);
  END IF;
END $$;

COMMENT ON COLUMN adsb.airports.source IS
  'reference = aérodrome du référentiel livré ; manuelle = zone ajoutée depuis '
  'l''interface (zone découverte, terrain privé, hélisurface…)';

-- Le type accepte désormais des valeurs propres aux zones manuelles.
-- Pas de contrainte CHECK sur `type` : la liste doit rester ouverte, on ne sait
-- pas d'avance ce que l'utilisateur va découvrir.
COMMENT ON COLUMN adsb.airports.type IS
  'aeroport | aerodrome | heliport | base | ulm | helisurface | prive | inconnu | …';

-- Mise à jour automatique de modifie_le
CREATE OR REPLACE FUNCTION adsb.airports_touch() RETURNS trigger AS $$
BEGIN
  NEW.modifie_le := now();
  RETURN NEW;
END $$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS airports_touch_trg ON adsb.airports;
CREATE TRIGGER airports_touch_trg
  BEFORE UPDATE ON adsb.airports
  FOR EACH ROW EXECUTE FUNCTION adsb.airports_touch();

-- Les fiches existantes viennent du référentiel
UPDATE adsb.airports SET source = 'reference' WHERE source IS NULL;

SELECT source, count(*) FILTER (WHERE actif) AS actives,
       count(*) AS total
FROM adsb.airports GROUP BY source ORDER BY source;
