-- Migration 075: backfill listings.repair_state из текста description (#622)
--
-- Покрытие структурного repair_state низкое (avito ~1% / cian ~5% / yandex 0%),
-- что недостаточно для data-derived repair-коэффициентов (#7 v2). Эта миграция
-- извлекает состояние ремонта из текста описания регэкспами по русским фразам —
-- тот же набор паттернов, что и repair_state_normalizer.infer_repair_state_from_text().
--
-- Порядок UPDATE'ов ВАЖЕН (от сильного сигнала к слабому):
--   excellent → good → needs_repair → standard.
-- Каждый шаг трогает только оставшиеся NULL-строки (WHERE repair_state IS NULL),
-- поэтому «дизайнерский ремонт после черновой» получит excellent, а не needs_repair.
--
-- Idempotent: повторный прогон ничего не меняет — все совпавшие строки уже
-- получили не-NULL значение и отсекаются предикатом repair_state IS NULL.
-- Не фабрикуем: строки без совпадения паттерна остаются NULL.
-- Issue: #622

BEGIN;

-- ── excellent: дизайнерский / премиальный / эксклюзивный / авторский ремонт ──
UPDATE listings
SET repair_state = 'excellent'
WHERE repair_state IS NULL
  AND description ~* '(дизайнерск(ий|ого|ом|ая)\s+ремонт|дизайнерск(ая|ой)\s+отделк|премиальн\w*\s+ремонт|эксклюзивн\w*\s+ремонт|авторск\w*\s+ремонт)';

-- ── good: евроремонт / отличный / свежий / современный / качественный ремонт ─
UPDATE listings
SET repair_state = 'good'
WHERE repair_state IS NULL
  AND description ~* '(евроремонт|евро[\s-]?ремонт|отличн\w*\s+ремонт|свеж\w*\s+ремонт|современн\w*\s+ремонт|качественн\w*\s+ремонт|ремонт\s+в\s+отличн)';

-- ── needs_repair: без отделки / черновая / требует ремонта / под ремонт ──────
UPDATE listings
SET repair_state = 'needs_repair'
WHERE repair_state IS NULL
  AND description ~* '(без\s+отделк|без\s+ремонт|черновая\s+отделк|черновой\s+ремонт|требует(ся)?\s+ремонт|требует(ся)?\s+космет|нужен\s+ремонт|под\s+ремонт|под\s+чистов\w+\s+отделк|предчистов)';

-- ── standard: косметический / обычный / жилое (хорошее) состояние ────────────
UPDATE listings
SET repair_state = 'standard'
WHERE repair_state IS NULL
  AND description ~* '(косметическ\w*\s+ремонт|косметическ\w*\s+отделк|обычн\w*\s+ремонт|жил(ое|ом)\s+состоян|хорош\w*\s+состоян)';

COMMIT;
