-- 082_scrape_schedules_seed_ratio_refresh.sql
-- #648 Stage 4 — seed scrape_schedules row для daily asking→sold ratio refresh.
--
-- ПРОБЛЕМА: asking_to_sold_ratios (migration 080) засеяна один раз; оценщик (estimator.py,
--   Stage 3) читает её per-estimate (cache 300s) и домножает asking-median прогноз на
--   sold/asking. По мере ночного импорта новых ДКП-сделок (rosreestr_dkp_import) ratio
--   устаревает. Stage 4 = TRUE-MIRROR refresh-задача recompute_asking_to_sold_ratios()
--   (app/tasks/asking_to_sold_ratio.py): DELETE WHERE district='' + re-derive INSERT
--   (та же 080-derivation) в одной транзакции, по расписанию. Запускается in-app
--   scheduler'ом (source='asking_to_sold_ratio_refresh', trigger_asking_to_sold_ratio_run).
--
-- enabled = true — БЕЗОПАСНО включать сразу: pure-internal DB re-derivation, никаких
--   внешних HTTP-вызовов / анти-бота (в отличие от avito/yandex sweep, которые seed'ятся
--   DORMANT). DELETE+INSERT атомарны (одна транзакция) — таблица не остаётся пустой.
-- Окно 06:00-07:00 UTC — ПОСЛЕ rosreestr_dkp_import (04:00-06:00 UTC, см. 072), чтобы
--   refresh потреблял свежие ДКП-сделки того же дня (а не отставал на сутки).
-- next_run_at = завтрашнее наступление окна (tomorrow + 06:00 UTC), иначе при NULL
--   get_due_schedules() выстрелит сразу после деплоя. AT TIME ZONE 'UTC' фиксирует
--   wall-clock час в UTC независимо от session TimeZone GUC (образец 078/079).
--
-- ЗАВИСИМОСТИ: 052_scrape_schedules.sql (таблица + UNIQUE(source)),
--   080_asking_to_sold_ratios.sql (таблица, derivation которую переиспользует refresh).
-- Idempotent: ON CONFLICT (source) DO NOTHING — безопасно запускать повторно.
-- Apply after: 081_trade_in_estimates_expected_sold.sql

BEGIN;

INSERT INTO scrape_schedules (
    source,
    enabled,
    window_start_hour,
    window_end_hour,
    next_run_at,
    default_params
)
VALUES
(
    'asking_to_sold_ratio_refresh',
    true,                                        -- SAFE: pure internal DB, no external calls
    6,
    7,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 6)) AT TIME ZONE 'UTC',
    '{}'::jsonb
)
ON CONFLICT (source) DO NOTHING;

COMMENT ON TABLE scrape_schedules IS
    'In-app scheduler config (заменяет cron-script setup). '
    'Sources: avito_city_sweep, yandex_city_sweep (dormant, #561), '
    'cian_history_backfill, rosreestr_dkp_import, listing_source_snapshot (#570), '
    'asking_to_sold_ratio_refresh (#648).';

COMMIT;
