"""Parity-proof: `scripts/ingest_domclick_jsonl.py` (#2305, Group A) — legacy vs scraper_kit.

`scripts/ingest_domclick_jsonl.py` теперь строит `ScrapedLot` из
`scraper_kit.base` (вместо `app.services.scrapers.base`) и вызывает
`scraper_kit.base.save_listings` (matcher/region_code инжектируются — см.
`app/services/scraper_adapters.RealMatcherAdapter` + `DEFAULT_REGION_CODE`).

`DomClickDetailEnrichment`/`save_detail_enrichment` изначально планировались
остаться на legacy: на момент начала миграции admin.py `domclick_detail.py` не
имел kit-эквивалента (см. audit `Scraper_Kit_Legacy_Dependency_Audit_0703`).
Issue #2307 (Group D, PR #2318) портировал `domclick_detail.py` в kit ПАРАЛЛЕЛЬНО
с этой задачей и явно оставил `scripts/ingest_domclick_jsonl.py` untouched
("the only other domclick_detail caller is scripts/ingest_domclick_jsonl.py,
also untouched") — поэтому переключение этого caller'а сделано ЗДЕСЬ, в рамках
#2305, теперь когда kit-эквивалент существует. `parse_detail_html`/exception-
parity для domclick_detail уже исчерпывающе доказаны в
`tests/scrapers/test_domclick_detail_kit_parity.py` (issue #2307) — этот файл
НЕ дублирует то доказательство, а фокусируется на конкретной точке потребления:
`ScrapedLot`/`DomClickDetailEnrichment`, сконструированные ИЗ ТЕХ ЖЕ kwargs, что
и `_build_lot()`/`_build_enrichment()` в самом скрипте.
"""

from __future__ import annotations

import os

os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://test:test@localhost/test_db")

from scraper_kit.base import ScrapedLot as KitScrapedLot
from scraper_kit.providers.domclick.detail import (
    DomClickDetailEnrichment as KitDomClickDetailEnrichment,
)

from app.services.scrapers.base import ScrapedLot as LegacyScrapedLot
from app.services.scrapers.domclick_detail import (
    DomClickDetailEnrichment as LegacyDomClickDetailEnrichment,
)
from tests.support.parity import assert_parity

# Аналог одной ok-записи JSONL-раннера (см. ingest_domclick_jsonl._build_lot).
_LOT_KWARGS = {
    "source": "domklik",
    "source_url": "https://ekaterinburg.domclick.ru/card/sale__flat__2075729321",
    "source_id": "2075729321",
    "address": "Екатеринбург, ул. Тестовая, 1",
    "lat": 56.83,
    "lon": 60.6,
    "rooms": 2,
    "area_m2": 54.3,
    "floor": 5,
    "total_floors": 9,
    "year_built": 2015,
    "price_rub": 8500000,
    "listing_segment": "vtorichka",
    "repair_state": "euro",
    "raw_payload": {"is_sber_collateral": False, "square_price": 156538, "avm": {}},
}

# Аналог одной ok-записи JSONL-раннера (см. ingest_domclick_jsonl._build_enrichment).
_ENRICHMENT_KWARGS = {
    "item_id": "2075729321",
    "source_url": "https://ekaterinburg.domclick.ru/card/sale__flat__2075729321",
    "repair_state": "euro",
    "repair_type": "евроремонт",
    "living_area_m2": 32.1,
    "kitchen_area_m2": 9.5,
    "sale_type": "free",
    "owners_count": 1,
    "encumbrances_clean": True,
    "year_built": 2015,
    "views_total": 338,
    "price_changes": [{"change_time": "2026-01-15T00:00:00", "price_rub": 8500000}],
    "raw_extra": {"wall_type": "кирпично-монолитный", "calls": 5},
}


def _build_legacy_lot(rec: dict[str, object]) -> LegacyScrapedLot:
    return LegacyScrapedLot(**rec)  # type: ignore[arg-type]


def _build_kit_lot(rec: dict[str, object]) -> KitScrapedLot:
    return KitScrapedLot(**rec)  # type: ignore[arg-type]


def _build_legacy_enrichment(rec: dict[str, object]) -> LegacyDomClickDetailEnrichment:
    return LegacyDomClickDetailEnrichment(**rec)  # type: ignore[arg-type]


def _build_kit_enrichment(rec: dict[str, object]) -> KitDomClickDetailEnrichment:
    return KitDomClickDetailEnrichment(**rec)  # type: ignore[arg-type]


def test_scraped_lot_are_class_distinct() -> None:
    """Sanity: legacy/kit ScrapedLot — разные классы (pydantic), обычный `==` даёт False."""
    legacy_result = _build_legacy_lot(_LOT_KWARGS)
    kit_result = _build_kit_lot(_LOT_KWARGS)

    assert type(legacy_result) is not type(kit_result)
    assert legacy_result.model_dump() == kit_result.model_dump()


def test_parity_ingest_domclick_scraped_lot() -> None:
    """`ingest_domclick_jsonl._build_lot()` kwargs → ScrapedLot(legacy) vs ScrapedLot(kit)."""
    assert_parity(
        legacy_fn=_build_legacy_lot,
        kit_fn=_build_kit_lot,
        fixtures=[_LOT_KWARGS],
    )


def test_parity_ingest_domclick_enrichment() -> None:
    """`ingest_domclick_jsonl._build_enrichment()` kwargs →
    DomClickDetailEnrichment(legacy) vs DomClickDetailEnrichment(kit) —
    см. module docstring про переключение этого caller'а в рамках #2305."""
    assert_parity(
        legacy_fn=_build_legacy_enrichment,
        kit_fn=_build_kit_enrichment,
        fixtures=[_ENRICHMENT_KWARGS],
    )
