-- 04_inc_latlng.sql — fleettickets · populate lat/lng from the resolved geom
-- ─────────────────────────────────────────────────────────────────────────────
-- The source feed never carries coordinates (latitude/longitude are always empty),
-- but geocoding resolves a position into `geom` (feed -> location -> cluster). This
-- redefines the latitude/longitude generated columns to fall back to that geom when
-- the feed is empty, so they are actually populated for every geocoded ticket.
--
-- Precision still varies by geo_source ('location' = street-level, 'cluster' =
-- cluster centroid). geom is a regular column (set by the geom trigger / resolve),
-- which a generated column may reference; ST_X/ST_Y are IMMUTABLE. STORED, so it
-- recomputes whenever geom changes (e.g. after a geocode pass). Idempotent.
-- ─────────────────────────────────────────────────────────────────────────────

SET search_path = tickets, public;

-- redefine (drop + re-add) the two generated columns added in migration 03
ALTER TABLE tickets.inc DROP COLUMN IF EXISTS latitude;
ALTER TABLE tickets.inc DROP COLUMN IF EXISTS longitude;

ALTER TABLE tickets.inc
  ADD COLUMN IF NOT EXISTS latitude double precision GENERATED ALWAYS AS
    (COALESCE(NULLIF(raw->>'latitude','')::double precision, ST_Y(geom))) STORED,
  ADD COLUMN IF NOT EXISTS longitude double precision GENERATED ALWAYS AS
    (COALESCE(NULLIF(raw->>'longitude','')::double precision, ST_X(geom))) STORED;
