"""#2129 — `_unix_to_date` consolidation: SERP / houses / IMV должны давать ОДНУ дату
для одного и того же epoch.

До фикса было 3 независимые копии с разными timezone:
  - avito.py (inline в `_build_sort_timestamp_map`) — MSK (документировано #726)
  - avito_houses.py — UTC
  - avito_imv.py — naive/system-local (`datetime.fromtimestamp(ts)` без tz)

Один и тот же epoch мог давать РАЗНЫЕ `date` в разных путях (пример из живой fixture
avito_imv_getdata.json: removedDate=1756077885 → UTC 2025-08-24, MSK 2025-08-25).

Офлайн: без сети/curl_cffi/БД, только импорт + чистые функции.

Легаси `app.services.scrapers.avito` / `avito_shared` / `avito_detail` / `avito_imv` /
`avito_houses` удалены (#2397 финальный шаг E, 0 runtime importers) — вся
consolidation-проверка переведена на kit-эквиваленты (`scraper_kit.providers.avito.
serp/shared/detail/houses/imv`), которые используют ТОТ ЖЕ единый источник правды
(`scraper_kit.providers.avito.shared._unix_to_date` / `RUS_MONTHS`) — регрессия
"3 независимые копии с разными TZ" остаётся под наблюдением на kit-стороне (теперь
единственной живой).
"""

from __future__ import annotations

import os
from datetime import date

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

from scraper_kit.providers.avito import detail as kit_avito_detail
from scraper_kit.providers.avito import houses as kit_avito_houses
from scraper_kit.providers.avito import imv as kit_avito_imv
from scraper_kit.providers.avito import serp as kit_avito_serp
from scraper_kit.providers.avito import shared as kit_avito_shared

# Живой пример из fixtures/avito_imv_getdata.json (placementHistory.items[0].removedDate) —
# именно тот timestamp, на котором UTC и MSK расходились в date() ДО фикса
# (UTC → 2025-08-24, MSK → 2025-08-25).
_EPOCH_SECONDS = 1756077885
_EXPECTED_MSK_DATE = date(2025, 8, 25)


def test_shared_unix_to_date_uses_msk() -> None:
    """Канонический источник правды — MSK (обоснование в shared.py)."""
    assert kit_avito_shared._unix_to_date(_EPOCH_SECONDS) == _EXPECTED_MSK_DATE


def test_avito_houses_reexports_shared_unix_to_date() -> None:
    """kit houses.py не держит свою копию — импортирует общую функцию."""
    assert kit_avito_houses._unix_to_date is kit_avito_shared._unix_to_date
    assert kit_avito_houses._unix_to_date(_EPOCH_SECONDS) == _EXPECTED_MSK_DATE


def test_kit_avito_imv_reexports_shared_unix_to_date() -> None:
    """kit imv.py не держит свою копию — импортирует общую функцию (тот же паттерн,
    что и kit houses.py/shared.py после фикса #2129)."""
    assert kit_avito_imv._unix_to_date is kit_avito_shared._unix_to_date
    assert kit_avito_imv._unix_to_date(_EPOCH_SECONDS) == _EXPECTED_MSK_DATE


def test_avito_serp_sort_timestamp_matches_shared_date() -> None:
    """serp.py путь (SERP `sortTimeStamp`, epoch-МС) для того же момента времени
    даёт ТУ ЖЕ дату, что и houses/IMV путь (epoch-секунды) — единственная разница
    в единицах измерения epoch, TZ общая (MSK) во всех путях."""
    html = (
        f'<div>{{"id":8043936560,"sortTimeStamp":{_EPOCH_SECONDS * 1000},'
        f'"addressDetailed":{{"foo":"bar"}}}}</div>'
    )
    ts_map = kit_avito_serp._build_sort_timestamp_map(html)
    assert ts_map["8043936560"] == _EXPECTED_MSK_DATE
    # avito/shared + avito_houses/avito_imv все согласованы на одном моменте времени:
    assert (
        ts_map["8043936560"]
        == kit_avito_houses._unix_to_date(_EPOCH_SECONDS)
        == kit_avito_imv._unix_to_date(_EPOCH_SECONDS)
        == kit_avito_shared._unix_to_date(_EPOCH_SECONDS)
    )


def test_rus_months_single_source() -> None:
    """RUS_MONTHS (тоже была продублирована ×3) — общий словарь, не 3 копии."""
    assert kit_avito_detail.RUS_MONTHS is kit_avito_shared.RUS_MONTHS
    assert kit_avito_houses.RUS_MONTHS is kit_avito_shared.RUS_MONTHS
    assert kit_avito_shared.RUS_MONTHS["декабря"] == 12


def test_unix_to_date_none_and_zero() -> None:
    """None и 0 — sentinel «нет даты» → None (сохранено поведение старых копий)."""
    assert kit_avito_shared._unix_to_date(None) is None
    assert kit_avito_shared._unix_to_date(0) is None
