-- 081_trade_in_estimates_expected_sold.sql
-- #648 Stage 3 — persist the asking→sold corrected price on each estimate.
--
-- ПРОБЛЕМА (#648). Estimator (estimator.py) отдаёт headline-медиану по АКТИВНЫМ
--   asking-объявлениям. Backtest (#648 Stage 1) показал систематический bias
--   asking-медианы +20% над реальной ДКП-ценой. Stage 2 (migration 080) сохранил
--   per-rooms коэффициент asking_to_sold_ratios (ratio = sold/asking, ~0.72–0.93).
--   Stage 3 (estimator) ДОПОЛНИТЕЛЬНО (purely additive — headline НЕ меняется)
--   вычисляет expected_sold = asking × ratio. Эту параллельную цену надо
--   ПЕРСИСТИТЬ на trade_in_estimates, чтобы shared-link reopen (GET /estimate/{id})
--   и PDF (GET /estimate/{id}/pdf) её отдавали (re-SELECT строит AggregatedEstimate
--   из явных колонок — без персиста значения терялись бы при reopen).
--
-- ДОБАВЛЯЕТ (все nullable — backward-safe; старые строки = NULL = «нет коррекции»):
--   expected_sold_price        bigint   — asking median_price × ratio
--   expected_sold_range_low    bigint   — asking range_low × ratio
--   expected_sold_range_high   bigint   — asking range_high × ratio
--   expected_sold_per_m2       int      — asking median ₽/м² × ratio
--   asking_to_sold_ratio       numeric  — применённый ratio (=sold/asking), диагностика
--   ratio_basis                text     — 'per_rooms' | 'global_fallback'
--
-- GRACEFUL: если asking_to_sold_ratios пуста / бакета нет — estimator пишет NULL
--   в эти колонки (sold-коррекция недоступна), оценка возвращается штатно.
--
-- ЗАВИСИМОСТИ: trade_in_estimates (existing), asking_to_sold_ratios (080).
--   Idempotent (ADD COLUMN IF NOT EXISTS) — безопасно ре-apply / dry-run.
-- Apply after: 080_asking_to_sold_ratios.sql

BEGIN;

ALTER TABLE trade_in_estimates
    ADD COLUMN IF NOT EXISTS expected_sold_price      bigint,
    ADD COLUMN IF NOT EXISTS expected_sold_range_low  bigint,
    ADD COLUMN IF NOT EXISTS expected_sold_range_high bigint,
    ADD COLUMN IF NOT EXISTS expected_sold_per_m2     int,
    ADD COLUMN IF NOT EXISTS asking_to_sold_ratio     numeric,
    ADD COLUMN IF NOT EXISTS ratio_basis              text;

COMMENT ON COLUMN trade_in_estimates.expected_sold_price IS
    '#648 S3: asking median_price × per-rooms sold/asking ratio. NULL = коррекция недоступна.';
COMMENT ON COLUMN trade_in_estimates.expected_sold_range_low IS
    '#648 S3: asking range_low × ratio.';
COMMENT ON COLUMN trade_in_estimates.expected_sold_range_high IS
    '#648 S3: asking range_high × ratio.';
COMMENT ON COLUMN trade_in_estimates.expected_sold_per_m2 IS
    '#648 S3: asking median ₽/м² × ratio.';
COMMENT ON COLUMN trade_in_estimates.asking_to_sold_ratio IS
    '#648 S3: применённый ratio (=sold/asking, ~0.72–0.93) из asking_to_sold_ratios (080).';
COMMENT ON COLUMN trade_in_estimates.ratio_basis IS
    '#648 S3: источник ratio — ''per_rooms'' (свой бакет) | ''global_fallback'' (rooms_bucket=-1).';

COMMIT;
