-- 051_scrape_runs_extend.sql
-- Расширение таблицы scrape_runs для поддержки city sweep pipeline:
--   - params jsonb      — параметры запуска (radius_m, pages_per_anchor, …)
--   - counters jsonb    — агрегированные счётчики (aggregate anchors_done, lots_fetched, …)
--   - error text        — краткое сообщение об ошибке (alias для error_text)
--   - finished_at       — время завершения run (done/failed/cancelled)
--   - 'cancelled' в status CHECK
--
-- Dependencies: 015_scrape_runs.sql
-- Идемпотентно: безопасно запускать повторно (ALTER ADD COLUMN IF NOT EXISTS).

BEGIN;

-- 1. Добавить params jsonb — конфигурация запуска
ALTER TABLE scrape_runs
    ADD COLUMN IF NOT EXISTS params jsonb;

-- 2. Добавить counters jsonb — агрегированные счётчики (city sweep)
ALTER TABLE scrape_runs
    ADD COLUMN IF NOT EXISTS counters jsonb;

-- 3. Добавить finished_at (было только в error_text / heartbeat_at)
ALTER TABLE scrape_runs
    ADD COLUMN IF NOT EXISTS finished_at timestamptz;

-- 4. Добавить error text (alias для краткого сообщения, совместимо с scrape_runs utility module)
--    error_text уже существует (из 015) — добавляем error как синоним для новых runs.
--    Utility module пишет в 'error' — перенаправляем на error_text через generated column
--    НЕ работает в PostGIS/PG16 для text → используем просто второй столбец.
ALTER TABLE scrape_runs
    ADD COLUMN IF NOT EXISTS error text;

-- 5. Расширить CHECK constraint status чтобы допускал 'cancelled'
-- DROP + ADD (нельзя ALTER CHECK в Postgres без пересоздания)
ALTER TABLE scrape_runs
    DROP CONSTRAINT IF EXISTS scrape_runs_status_check;

ALTER TABLE scrape_runs
    ADD CONSTRAINT scrape_runs_status_check
    CHECK (status IN ('running', 'done', 'failed', 'zombie', 'skipped', 'banned', 'cancelled'));

-- 6. run_type имеет NOT NULL в 015 — для city sweep run_type = 'city_sweep'
--    Убедимся что INSERT в scrape_runs.py покрывает это через DEFAULT
ALTER TABLE scrape_runs
    ALTER COLUMN run_type SET DEFAULT 'city_sweep';

COMMENT ON COLUMN scrape_runs.params IS
    'JSON-параметры запуска pipeline (pages_per_anchor, radius_m, detail_top_n, …)';
COMMENT ON COLUMN scrape_runs.counters IS
    'JSON-счётчики прогресса (anchors_done, lots_fetched, houses_enriched, …). '
    'Обновляется heartbeat''ом каждый anchor.';
COMMENT ON COLUMN scrape_runs.finished_at IS
    'Время завершения run (status=done/failed/cancelled).';
COMMENT ON COLUMN scrape_runs.error IS
    'Краткое сообщение об ошибке (для status=failed). Первые 1000 символов.';

COMMIT;
