-- ═══════════════════════════════════════════════════════════════════════════
-- Listes de surveillance d'aéronefs
--
-- Deux tables plutôt qu'une colonne « liste » libre : une liste est un objet
-- qu'on renomme, colore et supprime, et sa suppression doit emporter ses
-- membres. Une chaîne répétée sur chaque ligne rendrait le renommage fragile.
--
-- La clé de surveillance est l'adresse ICAO 24 bits, stable pour une cellule
-- donnée, et non l'indicatif, qui change à chaque vol et manque souvent.
--
-- À jouer avec ON_ERROR_STOP=1.
-- ═══════════════════════════════════════════════════════════════════════════

BEGIN;

CREATE TABLE IF NOT EXISTS adsb.watchlists (
    id          serial PRIMARY KEY,
    nom         varchar(60)  NOT NULL UNIQUE,
    couleur     varchar(9)   NOT NULL DEFAULT '#d29922',
    description text,
    actif       boolean      NOT NULL DEFAULT true,
    created_at  timestamptz  NOT NULL DEFAULT now()
);

COMMENT ON TABLE adsb.watchlists IS
    'Listes de surveillance nommées (ex. Militaires, Hélicoptères).';

CREATE TABLE IF NOT EXISTS adsb.watchlist_items (
    id            serial PRIMARY KEY,
    watchlist_id  integer      NOT NULL
                    REFERENCES adsb.watchlists(id) ON DELETE CASCADE,
    icao          varchar(6)   NOT NULL,
    motif         text,
    -- Instantané des métadonnées au moment de la mise sous surveillance.
    -- Redondant avec aircraft_history, et c'est voulu : il garde une trace de
    -- ce qui avait motivé l'ajout, même si la fiche de l'appareil change
    -- ensuite, et évite une jointure à chaque affichage de la liste.
    callsign      varchar(12),
    aircraft_type varchar(8),
    aircraft_desc varchar(60),
    aircraft_wtc  varchar(4),
    operator_name varchar(120),
    country       varchar(60),
    added_at      timestamptz  NOT NULL DEFAULT now(),
    CONSTRAINT watchlist_items_uniq UNIQUE (watchlist_id, icao),
    -- Normalisation imposée en base : l'API majuscule déjà, mais une insertion
    -- manuelle en minuscules créerait un doublon invisible.
    CONSTRAINT watchlist_items_icao_upper CHECK (icao = upper(icao))
);

-- Recherche « cet appareil est-il surveillé ? » lors du rendu des tableaux
CREATE INDEX IF NOT EXISTS watchlist_items_icao_idx
    ON adsb.watchlist_items (icao);

COMMENT ON TABLE adsb.watchlist_items IS
    'Aéronefs surveillés, identifiés par leur adresse ICAO 24 bits.';

-- Liste par défaut, pour que le bouton « Surveiller » ait une cible dès le
-- premier clic sans imposer la création préalable d'une liste.
INSERT INTO adsb.watchlists (nom, couleur, description)
SELECT 'Surveillance', '#d29922', 'Liste par défaut'
WHERE NOT EXISTS (SELECT 1 FROM adsb.watchlists);

COMMIT;

\echo '--- Tables créées ---'
SELECT w.id, w.nom, w.couleur, w.actif, count(i.id) AS appareils
FROM adsb.watchlists w
LEFT JOIN adsb.watchlist_items i ON i.watchlist_id = w.id
GROUP BY w.id, w.nom, w.couleur, w.actif
ORDER BY w.id;
