"""Audit-scrapers finding 3: Avito detail publish_date year-boundary rollover.

Avito не показывает год для дат текущего года («20 декабря в 15:30»). Раньше
`_extract_meta` всегда брал ТЕКУЩИЙ год момента парсинга — объявлению, опубликованному
в декабре и прочитанному в январе следующего года, ставился год парсинга (будущая
дата), завышая свежесть лота. Фикс: если получившаяся дата оказалась в будущем
относительно момента парсинга — откатываем на год назад.

Refs: audit-scrapers 2026-07-26, finding 3 (low).
"""

from __future__ import annotations

import os
from datetime import date as real_date

import pytest
from selectolax.parser import HTMLParser

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

from scraper_kit.providers.avito import detail as kit_detail


def _freeze_today(monkeypatch: pytest.MonkeyPatch, frozen: real_date) -> None:
    """Подменяет `date` в scraper_kit.providers.avito.detail так, что date.today()
    детерминированно возвращает `frozen` (date — immutable C-тип, .today нельзя
    monkeypatch'нуть напрямую — подменяем ссылку на класс в модуле)."""

    class _FrozenDate(real_date):
        @classmethod
        def today(cls) -> real_date:  # type: ignore[override]
            return frozen

    monkeypatch.setattr(kit_detail, "date", _FrozenDate)


def _tree_with_publish_text(text: str) -> HTMLParser:
    html = f'<html><body><div data-marker="item-view/item-id">{text}</div></body></html>'
    return HTMLParser(html)


def test_december_publish_date_read_in_january_rolls_back_a_year(
    monkeypatch: pytest.MonkeyPatch,
) -> None:
    """Объявление '20 декабря' парсится 5 января СЛЕДУЮЩЕГО года: без фикса
    дата была бы 2027-12-20 (в будущем относительно today=2027-01-05) — теперь
    откатывается на 2026-12-20."""
    _freeze_today(monkeypatch, real_date(2027, 1, 5))
    tree = _tree_with_publish_text("№ 4291500000 · 20 декабря в 15:30")

    publish_date, _, _ = kit_detail._extract_meta(tree)

    assert publish_date == real_date(2026, 12, 20)


def test_same_year_past_publish_date_not_rolled_back(monkeypatch: pytest.MonkeyPatch) -> None:
    """Control: дата в прошлом (не будущем) в том же году — год НЕ откатывается."""
    _freeze_today(monkeypatch, real_date(2027, 1, 5))
    tree = _tree_with_publish_text("№ 4291500001 · 3 января в 09:00")

    publish_date, _, _ = kit_detail._extract_meta(tree)

    assert publish_date == real_date(2027, 1, 3)


def test_publish_date_equal_to_today_not_rolled_back(monkeypatch: pytest.MonkeyPatch) -> None:
    """Control: дата ровно = today (не строго будущее) — год НЕ откатывается."""
    _freeze_today(monkeypatch, real_date(2027, 1, 5))
    tree = _tree_with_publish_text("№ 4291500002 · 5 января в 12:00")

    publish_date, _, _ = kit_detail._extract_meta(tree)

    assert publish_date == real_date(2027, 1, 5)


def test_mid_year_publish_date_not_rolled_back(monkeypatch: pytest.MonkeyPatch) -> None:
    """Обычный случай вдали от границы года — поведение не меняется."""
    _freeze_today(monkeypatch, real_date(2027, 6, 15))
    tree = _tree_with_publish_text("№ 4291500003 · 20 марта в 10:00")

    publish_date, _, _ = kit_detail._extract_meta(tree)

    assert publish_date == real_date(2027, 3, 20)


def test_no_publish_date_in_text_returns_none(monkeypatch: pytest.MonkeyPatch) -> None:
    """Regression guard: отсутствие даты в тексте по-прежнему даёт None (не падает)."""
    _freeze_today(monkeypatch, real_date(2027, 1, 5))
    tree = _tree_with_publish_text("№ 4291500004")

    publish_date, _, _ = kit_detail._extract_meta(tree)

    assert publish_date is None
