-- =============================================================================
-- 04_airports.sql — table de référence des aérodromes d'Île-de-France
--
-- Sert de liste d'exclusion à l'onglet « Départs hors aérodromes » : tout point
-- de décollage situé dans le rayon d'un aérodrome ACTIF est écarté des
-- résultats. Chaque site a son propre rayon, ajustable indépendamment.
--
-- Le rayon n'est pas la taille de l'aérodrome mais la zone dans laquelle un
-- avion en montée initiale est encore attribuable à ce terrain. Il est donc
-- plus large pour les grandes plateformes (trajectoires de départ étendues)
-- que pour un héliport.
--
-- Usage :
--   docker exec -i wordpress-postgres psql -U pgz_admin -d wpz_postgres \
--     -v ON_ERROR_STOP=1 < 04_airports.sql
-- =============================================================================

\set ON_ERROR_STOP on

CREATE TABLE IF NOT EXISTS adsb.airports (
    id          serial PRIMARY KEY,
    code        text NOT NULL UNIQUE,          -- code OACI (LFPG, LFPO, ...)
    nom         text NOT NULL,
    lat         double precision NOT NULL,
    lon         double precision NOT NULL,
    rayon_km    double precision NOT NULL DEFAULT 8,
    type        text NOT NULL DEFAULT 'aerodrome',  -- aeroport|aerodrome|heliport|base
    actif       boolean NOT NULL DEFAULT true,
    commentaire text
);

COMMENT ON TABLE adsb.airports IS
  'Aérodromes connus, utilisés comme zones d''exclusion pour la détection des '
  'départs atypiques. actif=false désactive l''exclusion sans perdre la fiche.';
COMMENT ON COLUMN adsb.airports.rayon_km IS
  'Rayon d''exclusion en km : zone dans laquelle une montée initiale est '
  'considérée comme issue de ce terrain.';

-- Colonne géographique générée, pour un ST_DWithin indexable
ALTER TABLE adsb.airports
  ADD COLUMN IF NOT EXISTS geom geography(Point,4326)
  GENERATED ALWAYS AS (ST_SetSRID(ST_MakePoint(lon, lat), 4326)::geography) STORED;

CREATE INDEX IF NOT EXISTS airports_geom_gix ON adsb.airports USING GIST (geom);
CREATE INDEX IF NOT EXISTS airports_actif_idx ON adsb.airports (actif) WHERE actif;

-- ── Données de référence ─────────────────────────────────────────────────────
-- Rayons de départ, à ajuster selon les résultats observés.
INSERT INTO adsb.airports (code, nom, lat, lon, rayon_km, type, commentaire) VALUES
  ('LFPG', 'Paris-Charles de Gaulle',      49.0097,  2.5479, 15, 'aeroport',
   'Doublets de pistes, départs très étalés — rayon large'),
  ('LFPO', 'Paris-Orly',                   48.7233,  2.3794, 12, 'aeroport',
   'Départs vers le sud et l''ouest'),
  ('LFPB', 'Paris-Le Bourget',             48.9694,  2.4414, 10, 'aeroport',
   'Aviation d''affaires, trafic dense en jets'),
  ('LFPV', 'Vélizy-Villacoublay',          48.7744,  2.2014,  8, 'base',
   'Base aérienne 107 — à ~6 km de la station, très bien captée'),
  ('LFPN', 'Toussus-le-Noble',             48.7519,  2.1062,  8, 'aerodrome',
   'Aviation légère et écoles — fort volume de tours de piste'),
  ('LFPZ', 'Saint-Cyr-l''École',           48.8081,  2.0736,  6, 'aerodrome',
   'Aviation légère, planeurs'),
  ('LFPI', 'Paris-Issy-les-Moulineaux',    48.8331,  2.2725,  4, 'heliport',
   'Héliport de Paris — à ~1 km de la station, couverture excellente'),
  ('LFPM', 'Melun-Villaroche',             48.6047,  2.6711,  8, 'aerodrome',
   'Essais en vol et aviation générale'),
  ('LFPT', 'Pontoise-Cormeilles',          49.0966,  2.0408,  8, 'aerodrome',
   'Aviation légère, école'),
  ('LFPL', 'Lognes-Émerainville',          48.8228,  2.6261,  6, 'aerodrome',
   'Aviation légère'),
  ('LFPK', 'Coulommiers-Voisins',          48.8375,  3.0161,  8, 'aerodrome',
   'Limite est de la couverture'),
  ('LFXU', 'Les Mureaux',                  48.9983,  1.9433,  6, 'aerodrome',
   'Aérodrome industriel'),
  ('LFPU', 'Moret-Épisy',                  48.3422,  2.7986,  6, 'aerodrome',
   'Planeurs — souvent hors de portée'),
  ('LFAI', 'Nangis-Les Loges',             48.5961,  3.0067,  6, 'aerodrome',
   'Aviation légère, parachutisme'),
  ('LFOP', 'Rouen-Vallée de Seine',        49.3842,  1.1758, 10, 'aeroport',
   'Hors couverture nominale — désactivable'),
  ('LFOB', 'Beauvais-Tillé',               49.4544,  2.1128, 12, 'aeroport',
   'Limite nord de la couverture')
ON CONFLICT (code) DO NOTHING;

-- Sites au-delà de la portée utile : renseignés mais désactivés par défaut,
-- pour éviter d'exclure inutilement des zones où l'on ne capte rien.
UPDATE adsb.airports SET actif = false WHERE code IN ('LFOP', 'LFPU');

SELECT code, nom, rayon_km, type, actif FROM adsb.airports ORDER BY actif DESC, code;
