"""#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/БД, только импорт + чистые функции.
"""

from __future__ import annotations

import os
from datetime import date

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

from app.services.scrapers import avito, avito_houses, avito_imv, 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 (обоснование в avito_shared.py)."""
    assert avito_shared._unix_to_date(_EPOCH_SECONDS) == _EXPECTED_MSK_DATE


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


def test_avito_imv_reexports_shared_unix_to_date() -> None:
    """avito_imv.py больше не держит свою копию (была naive/system-local) — общая функция."""
    assert avito_imv._unix_to_date is avito_shared._unix_to_date
    assert avito_imv._unix_to_date(_EPOCH_SECONDS) == _EXPECTED_MSK_DATE


def test_avito_serp_sort_timestamp_matches_shared_date() -> None:
    """avito.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 = avito._build_sort_timestamp_map(html)
    assert ts_map["8043936560"] == _EXPECTED_MSK_DATE
    # Все три пути согласованы на одном моменте времени:
    assert (
        ts_map["8043936560"]
        == avito_houses._unix_to_date(_EPOCH_SECONDS)
        == avito_imv._unix_to_date(_EPOCH_SECONDS)
        == avito_shared._unix_to_date(_EPOCH_SECONDS)
    )


def test_rus_months_single_source() -> None:
    """RUS_MONTHS (тоже была продублирована ×3) — общий словарь, не 3 копии."""
    from app.services.scrapers import avito_detail

    assert avito_detail.RUS_MONTHS is avito_shared.RUS_MONTHS
    assert avito_houses.RUS_MONTHS is avito_shared.RUS_MONTHS
    assert avito_shared.RUS_MONTHS["декабря"] == 12


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