-- 179_scrape_schedules_seed_oblast_city_sweeps.sql
-- Seed rows для oblast-wide city-sweep (Свердловская область, region 66) — B1 rollout:
-- avito/cian/yandex city-sweep за пределами Екатеринбурга для 5 городов области.
-- Domclick (BFF, city_id-based) — отдельный B2 rollout, сюда НЕ входит.
--
-- !!! DORMANT BY DESIGN !!! Все 15 строк ship enabled = false.
--   Причина: в проксях-пуле сейчас только ОДИН здоровый прокси (см. scrape_proxies,
--   157/173) — параллельный/резкий rollout на 5 новых городов рискует забанить его.
--   Capability полностью wired (pipeline.CITY_ANCHORS/get_city_anchors,
--   scheduler._job_{avito,cian,yandex}_city_sweep читают default_params->>'city' и
--   резолвят anchors города, wildcard-registry "*_city_sweep_*" в
--   scraper_kit.orchestration.scheduler._default_kit_handlers), но schedule'ы
--   намеренно ВЫКЛЮЧЕНЫ. Оператор включает ВРУЧНУЮ по одному городу за раз:
--     UPDATE scrape_schedules SET enabled = true WHERE source = 'avito_city_sweep_nizhniy_tagil';
--
-- WHY отдельный source на город (а не один source + params.city со списком городов):
--   scrape_schedules.source — UNIQUE (052_scrape_schedules.sql). Несколько строк с
--   одним source='avito_city_sweep' невозможны (второй INSERT/UPDATE тем же source
--   либо конфликтует, либо перезаписывает первую строку — по факту только один город
--   был бы шедулирован). Поэтому каждый (source_type, город) — своя строка с source =
--   '<source_type>_<city_slug>' (например 'cian_city_sweep_kamensk_uralskiy'), а
--   `resolve_handler` в scraper_kit.orchestration.scheduler резолвит её на тот же
--   handler, что и EKB source, через wildcard-запись "avito_city_sweep_*" (и т.п.,
--   тот же механизм, что уже используется для "deactivate_stale_*"). Job читает
--   default_params->>'city' и подставляет anchors города вместо EKB_ANCHORS.
--
-- default_params: source's текущие прод-дефолты (см. SELECT ниже) + {"city": "<slug>"}.
-- Никакие другие поля (radius_m/pages_per_anchor/...) НЕ меняются в этой миграции —
-- один anchor на город (pipeline.CITY_ANCHORS) может не покрывать город целиком на
-- текущем radius_m (1500м у avito/cian) — ОПЕРАТОР должен пересмотреть radius_m перед
-- enable (город крупнее одного 1500м-круга — напр. Н.Тагил/Каменск-Уральский).
--
-- window_start_hour/window_end_hour (UTC, 1-часовые окна) — расставлены НЕ пересекаясь
-- ни друг с другом, ни с уже enabled EKB-окнами (avito 6-7, cian 2-5, yandex 16-17) —
-- на случай если оператор включит несколько строк сразу (proxy-pool = 1, конкурентные
-- sweep'ы разных источников делили бы тот же прокси).
--
-- ЗАВИСИМОСТИ: 052_scrape_schedules.sql (таблица + UNIQUE(source)).
-- Idempotent: ON CONFLICT (source) DO NOTHING — каждый source в этой миграции уникален
-- по построению (SELECT ниже подтверждает текущие прод-дефолты трёх EKB source'ов,
-- НЕ вставляется повторно и не конфликтует с ними — city_sweep_<slug> != city_sweep).

BEGIN;

INSERT INTO scrape_schedules (
    source,
    enabled,
    window_start_hour,
    window_end_hour,
    next_run_at,
    default_params
)
VALUES
-- ── avito_city_sweep_<city> (база: radius_m 1500, detail_top_n 20, enrich_houses true,
--    pages_per_anchor 3, request_delay_sec 7 — прод-дефолты avito_city_sweep) ──────────
(
    'avito_city_sweep_nizhniy_tagil',
    false,
    0,
    1,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 0)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "detail_top_n": 20, "request_delay_sec": 7.0, "enrich_houses": true, "radius_m": 1500, "city": "nizhniy_tagil"}'::jsonb
),
(
    'avito_city_sweep_kamensk_uralskiy',
    false,
    1,
    2,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 1)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "detail_top_n": 20, "request_delay_sec": 7.0, "enrich_houses": true, "radius_m": 1500, "city": "kamensk_uralskiy"}'::jsonb
),
(
    'avito_city_sweep_pervouralsk',
    false,
    5,
    6,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 5)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "detail_top_n": 20, "request_delay_sec": 7.0, "enrich_houses": true, "radius_m": 1500, "city": "pervouralsk"}'::jsonb
),
(
    'avito_city_sweep_verkhnyaya_pyshma',
    false,
    7,
    8,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 7)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "detail_top_n": 20, "request_delay_sec": 7.0, "enrich_houses": true, "radius_m": 1500, "city": "verkhnyaya_pyshma"}'::jsonb
),
(
    'avito_city_sweep_serov',
    false,
    8,
    9,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 8)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "detail_top_n": 20, "request_delay_sec": 7.0, "enrich_houses": true, "radius_m": 1500, "city": "serov"}'::jsonb
),
-- ── cian_city_sweep_<city> (база: radius_m 1500, detail_top_n 10, enrich_houses true,
--    pages_per_anchor 3, request_delay_sec 5 — прод-дефолты cian_city_sweep) ─────────
(
    'cian_city_sweep_nizhniy_tagil',
    false,
    9,
    10,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 9)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 5, "radius_m": 1500, "detail_top_n": 10, "enrich_houses": true, "city": "nizhniy_tagil"}'::jsonb
),
(
    'cian_city_sweep_kamensk_uralskiy',
    false,
    10,
    11,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 10)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 5, "radius_m": 1500, "detail_top_n": 10, "enrich_houses": true, "city": "kamensk_uralskiy"}'::jsonb
),
(
    'cian_city_sweep_pervouralsk',
    false,
    11,
    12,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 11)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 5, "radius_m": 1500, "detail_top_n": 10, "enrich_houses": true, "city": "pervouralsk"}'::jsonb
),
(
    'cian_city_sweep_verkhnyaya_pyshma',
    false,
    12,
    13,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 12)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 5, "radius_m": 1500, "detail_top_n": 10, "enrich_houses": true, "city": "verkhnyaya_pyshma"}'::jsonb
),
(
    'cian_city_sweep_serov',
    false,
    13,
    14,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 13)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 5, "radius_m": 1500, "detail_top_n": 10, "enrich_houses": true, "city": "serov"}'::jsonb
),
-- ── yandex_city_sweep_<city> (база: radius_m 25000, pages_per_anchor 3,
--    request_delay_sec 9 — прод-дефолты yandex_city_sweep; radius_m большой ok —
--    per 119_yandex_city_sweep_center_combos.sql это лишь fallback-фильтр, не
--    query-ограничение, лишний охват не увеличивает load) ────────────────────────
(
    'yandex_city_sweep_nizhniy_tagil',
    false,
    14,
    15,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 14)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 9, "radius_m": 25000, "city": "nizhniy_tagil"}'::jsonb
),
(
    'yandex_city_sweep_kamensk_uralskiy',
    false,
    15,
    16,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 15)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 9, "radius_m": 25000, "city": "kamensk_uralskiy"}'::jsonb
),
(
    'yandex_city_sweep_pervouralsk',
    false,
    17,
    18,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 17)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 9, "radius_m": 25000, "city": "pervouralsk"}'::jsonb
),
(
    'yandex_city_sweep_verkhnyaya_pyshma',
    false,
    18,
    19,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 18)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 9, "radius_m": 25000, "city": "verkhnyaya_pyshma"}'::jsonb
),
(
    'yandex_city_sweep_serov',
    false,
    19,
    20,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 19)) AT TIME ZONE 'UTC',
    '{"pages_per_anchor": 3, "request_delay_sec": 9, "radius_m": 25000, "city": "serov"}'::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, cian_city_sweep (EKB, enabled), '
    'avito_full_load, avito_full_load_exhaustive, cian_full_load, domclick_city_sweep, '
    'avito_city_sweep_<city>/cian_city_sweep_<city>/yandex_city_sweep_<city> '
    '(oblast B1 rollout — nizhniy_tagil/kamensk_uralskiy/pervouralsk/'
    'verkhnyaya_pyshma/serov, dormant, #179 — resolve_handler wildcard "*_city_sweep_*"), '
    'cian_history_backfill, rosreestr_dkp_import, listing_source_snapshot, '
    'asking_to_sold_ratio_refresh, refresh_search_matview, yandex_address_backfill, '
    'sber_index_pull, rosreestr_quarter_poll, deals_freshness_monitor, newbuilding_enrich, '
    'yandex_newbuilding_sweep, geoportal_coords_backfill, geocode_missing_listings, '
    'avito_detail_backfill, yandex_detail_backfill, cadastral_geo_match, '
    'osm_poi_ekb_refresh, house_imv_backfill, house_dedup_merge, proxy_healthcheck, '
    'deactivate_stale_avito/yandex/cian.';

COMMIT;
