from datetime import date, timedelta

from app.services.scrapers.avito import _parse_relative_date


def test_days_ago():
    assert _parse_relative_date("5 дней назад") == date.today() - timedelta(days=5)


def test_week_ago():
    assert _parse_relative_date("2 недели назад") == date.today() - timedelta(days=14)


def test_hour_ago_is_today():
    assert _parse_relative_date("3 часа назад") == date.today()


def test_none_passthrough():
    assert _parse_relative_date(None) is None
    assert _parse_relative_date("") is None
    assert _parse_relative_date("random text") is None


# Keyword shortcuts — без \d+ (Avito SERP формат для свежих cards)
def test_today_keyword():
    assert _parse_relative_date("сегодня в 12:30") == date.today()


def test_yesterday_keyword():
    assert _parse_relative_date("вчера в 18:45") == date.today() - timedelta(days=1)


def test_day_before_yesterday():
    assert _parse_relative_date("позавчера") == date.today() - timedelta(days=2)


def test_just_now():
    assert _parse_relative_date("только что") == date.today()


# Absolute dates — «18 мая», «5 июня в 12:30»
def test_absolute_date_recent():
    today = date.today()
    # Take a day-month combo near current (last month) — gradening для CI stability
    if today.month >= 2:
        target = date(today.year, today.month - 1, 15)
    else:
        target = date(today.year - 1, 12, 15)
    ru_months = {
        1: "января", 2: "февраля", 3: "марта", 4: "апреля",
        5: "мая", 6: "июня", 7: "июля", 8: "августа",
        9: "сентября", 10: "октября", 11: "ноября", 12: "декабря",
    }
    text = f"{target.day} {ru_months[target.month]} в 12:30"
    assert _parse_relative_date(text) == target


def test_absolute_date_future_month_rolls_back():
    """Если today январь, а текст «5 декабря» — это прошлый год."""
    today = date.today()
    if today.month == 1:
        # Today already January, «декабря» → previous year December
        result = _parse_relative_date("5 декабря")
        assert result == date(today.year - 1, 12, 5)
    else:
        # Skip when not January — would change semantics
        result = _parse_relative_date("5 января")
        # Either matches current year January (если уже прошло) или previous
        assert result is not None and result.month == 1 and result.day == 5
