-- 010_unify_races.sql — unify finished_races and live_races into a single
-- `races` table with a 5-state status.
--
-- After this migration the `races` table holds both the live
-- surface (lobby | countdown | racing) and the finished archive
-- (finished | cancelled). live_race_drivers keeps the same shape
-- (one row per (race, driver)). The former `finished_races` columns
-- are kept verbatim; the former `live_races` columns are added
-- (started_ms is reused, created_ms was there too).

-- 1) Rename finished_races -> races.
ALTER TABLE finished_races RENAME TO races;

-- 2) Drop the old finished-only check and replace with a unified one.
ALTER TABLE races DROP CONSTRAINT IF EXISTS finished_races_status_check;
ALTER TABLE races ADD CONSTRAINT races_status_check
    CHECK (status IN ('lobby', 'countdown', 'racing', 'finished', 'cancelled'));

-- 2a) Add the live-only columns to the (former) finished table.
ALTER TABLE races ADD COLUMN IF NOT EXISTS updated_ms BIGINT NOT NULL DEFAULT 0;

-- 3) Drop the old index that referenced the old table name and
-- recreate it. The new keyset index sorts on (status, finished_ms
-- DESC, id DESC) so the list view can read live+finished together
-- when needed.
DROP INDEX IF EXISTS finished_races_finished_ms_id_idx;
CREATE INDEX IF NOT EXISTS races_status_finished_idx
    ON races (status, finished_ms DESC, id DESC);
DROP INDEX IF EXISTS finished_races_host_idx; -- host_id no longer exists, but the
-- index name may have survived. Defensive drop.
CREATE INDEX IF NOT EXISTS races_started_idx
    ON races (status, started_ms DESC, id DESC);

-- 4) Move live rows from live_races into races BEFORE renaming
-- live_race_drivers, so the FK has somewhere to point.
INSERT INTO races
    (id, name, track_id, max_cars, laps, time_limit_s, status,
     created_ms, started_ms, finished_ms, updated_ms, podium)
SELECT
    id, name, track_id, max_cars, laps, time_limit_s, status,
    created_ms, started_ms, 0, updated_ms, '[]'::jsonb
FROM live_races
ON CONFLICT (id) DO UPDATE SET
    name = EXCLUDED.name,
    track_id = EXCLUDED.track_id,
    max_cars = EXCLUDED.max_cars,
    laps = EXCLUDED.laps,
    time_limit_s = EXCLUDED.time_limit_s,
    status = EXCLUDED.status,
    created_ms = EXCLUDED.created_ms,
    started_ms = EXCLUDED.started_ms,
    updated_ms = EXCLUDED.updated_ms;

-- 5) live_race_drivers: rename to race_drivers and re-target the FK
-- at the unified races table.
ALTER TABLE live_race_drivers RENAME TO race_drivers;
ALTER TABLE race_drivers
    DROP CONSTRAINT IF EXISTS live_race_drivers_race_id_fkey;
ALTER TABLE race_drivers
    ADD CONSTRAINT race_drivers_race_id_fkey
    FOREIGN KEY (race_id) REFERENCES races(id) ON DELETE CASCADE;

-- 6) Drop the now-redundant live tables.
DROP TABLE IF EXISTS live_race_drivers;
DROP TABLE IF EXISTS live_races;
