-- 132_scrape_schedules_seed_house_imv.sql
-- Scheduler seed for the house-level Avito IMV bulk backfill (#854).
--
-- WHAT (source='house_imv_backfill'):
--   trigger_house_imv_backfill_run (scheduler.py) → backfill_house_imv
--   (services/house_imv_backfill.py). Nightly bulk IMV-оценка на уровне домов:
--     1. SELECT houses WHERE imv_status=:only_status AND lat/lon NOT NULL
--        AND address NOT NULL ORDER BY last_imv_attempt_at NULLS FIRST, id LIMIT batch_size.
--     2. Для каждого дома: median lot-params из linked listings (rooms/area/floor +
--        mode(house_type)), region-bbox address prefix, evaluate_via_imv (Avito IMV API).
--     3. 3×UPSERT: house_imv_evaluations + house_placement_history + house_suggestions,
--        затем UPDATE houses.imv_status pending→ok/not_found/error/transient_error.
--   ВАЖНО: пишет в house_imv_evaluations (per-house, миграция 064) — НЕ в
--   avito_imv_evaluations (per-cache-key, миграция 018, наполняется on-demand из estimator).
--
--   Resumable + idempotent: imv_status-фильтр + UPSERT по house_id, поэтому каждый fire
--   дренит следующий batch без дублей. Avito IMV использует собственную curl_cffi-сессию
--   (proxy через env HTTP_PROXY/HTTPS_PROXY) — request_delay_sec анти-бот пауза между домами.
--
-- Window 15:00-17:00 UTC (18:00-20:00 MSK):
--   - После avito_full_load (13:00-15:00 UTC) и утреннего Avito-блока (city_sweep 02-05,
--     detail_backfill 09-12) — не делим Avito-инфраструктуру одновременно.
--   - После geocode_missing_listings (06-09 UTC) и cadastral_geo_match (09-10 UTC) — дома
--     к этому моменту имеют свежие lat/lon, обязательные для IMV-геокода.
--   - next_run_at = завтра 15:00 UTC (NOT NULL — не палим run на деплое; следуем
--     avito/cian seed-конвенции, NULL заставил бы get_due_schedules взять на первом тике).
--
-- default_params:
--   batch_size        -- домов за один прогон (50 ~ 4–7 мин при 5s/дом, дренит backlog за ночи).
--   request_delay_sec -- анти-бот пауза между IMV-вызовами (5s; НЕ снижать < 3s — Avito IMV
--                        реагирует на частые запросы с datacenter-IP).
--   only_status       -- imv_status домов к обработке ('pending' по умолчанию;
--                        'transient_error' для ретрая упавших).
--
-- enabled=true: безопасно — backfill resumable, batch-bounded, без DELETE/деструктива.
--
-- DEPENDENCIES: 052_scrape_schedules.sql (table + UNIQUE(source)),
--   064_house_imv_phase_c.sql (house_imv_evaluations + house_placement_history + houses.imv_status).
-- Idempotent: ON CONFLICT (source) DO NOTHING.

BEGIN;

INSERT INTO scrape_schedules (
    source,
    enabled,
    window_start_hour,
    window_end_hour,
    next_run_at,
    default_params
)
VALUES
(
    'house_imv_backfill',
    true,
    15,
    17,
    ((CURRENT_DATE + INTERVAL '1 day') + make_interval(hours => 15)) AT TIME ZONE 'UTC',
    '{"batch_size": 50, "request_delay_sec": 5, "only_status": "pending"}'::jsonb
)
ON CONFLICT (source) DO NOTHING;

COMMENT ON TABLE scrape_schedules IS
    'In-app scheduler config (replaces 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), refresh_search_matview (#769), yandex_address_backfill (#855, EKB pilot), sber_index_pull (#887, monthly), rosreestr_quarter_poll (#888, monthly), cian_city_sweep (dormant, #973), yandex_newbuilding_sweep (dormant, #974), geocode_missing_listings (#1: listings geom backfill, all sources), avito_detail_backfill (#1551: nightly detail-enrichment backfill for legacy avito listings), house_imv_backfill (#854: nightly bulk Avito IMV at house level → house_imv_evaluations).';

COMMIT;
