"""Тест per-card ЕКБ гео-фильтра в AvitoScraper._parse_html.

Avito при редких комбо (4+ комн., дорогой сегмент) добивает выдачу карточками
«по всей России» (Москва, Уфа, Челябинск и т.д.). Каждая карточка несёт
СВОЙ href с city-slug (/ekaterinburg/, /moskva/, ...). Фильтр (за флагом
settings.avito_serp_ekb_only) отбрасывает non-EKB карточки.

Тесты:
1. EKB + non-EKB в SERP → только ЕКБ остаётся при ekb_only=True.
2. ekb_only=False → все карточки проходят (старое поведение).
3. Карточка без распознанного city-slug → пропускается консервативно (не дропается).
4. Только EKB карточки → ничего не дропается (нет лишних логов).
"""

from __future__ import annotations

import os

import pytest

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


def _make_card_html(
    item_id: str,
    city_slug: str,
    price: int = 5_000_000,
    title: str = "2-к. квартира, 50 м², 3/9 эт.",
) -> str:
    """Минимальная Avito SERP-карточка с указанным city-slug в href."""
    href = f"/{city_slug}/kvartiry/{item_id}-12345"
    return f"""
    <div data-marker="item" data-item-id="{item_id}">
        <a data-marker="item-title" href="{href}">{title}</a>
        <meta itemprop="price" content="{price}"/>
        <div data-marker="item-location"><p>ул. Тестовая, 1</p></div>
    </div>
    """


def _build_serp_html(*cards: str) -> str:
    """Обернуть карточки в минимальный SERP-HTML."""
    inner = "".join(cards)
    return f"<html><body>{inner}</body></html>"


# ---------------------------------------------------------------------------
# 1. EKB + non-EKB → только ЕКБ при ekb_only=True
# ---------------------------------------------------------------------------


def test_geo_filter_drops_non_ekb_cards(monkeypatch: pytest.MonkeyPatch) -> None:
    """При avito_serp_ekb_only=True карточки других городов отсеиваются."""
    from app.core.config import settings
    from app.services.scrapers.avito import AvitoScraper

    monkeypatch.setattr(settings, "avito_serp_ekb_only", True)

    ekb_card = _make_card_html("EKB1", "ekaterinburg")
    msk_card = _make_card_html("MSK1", "moskva")
    ufa_card = _make_card_html("UFA1", "ufa")
    chelya_card = _make_card_html("CHE1", "chelyabinsk")

    html = _build_serp_html(ekb_card, msk_card, ufa_card, chelya_card)

    scraper = AvitoScraper()
    lots = scraper._parse_html(html, source_url_base="https://www.avito.ru/ekaterinburg/kvartiry/")

    source_ids = {lot.source_id for lot in lots}
    assert "EKB1" in source_ids, "ЕКБ-карточка должна пройти фильтр"
    assert "MSK1" not in source_ids, "Московская карточка должна быть отброшена"
    assert "UFA1" not in source_ids, "Уфимская карточка должна быть отброшена"
    assert "CHE1" not in source_ids, "Челябинская карточка должна быть отброшена"
    assert len(lots) == 1


# ---------------------------------------------------------------------------
# 2. ekb_only=False → все карточки проходят
# ---------------------------------------------------------------------------


def test_geo_filter_disabled_passes_all(monkeypatch: pytest.MonkeyPatch) -> None:
    """При avito_serp_ekb_only=False все карточки проходят (старое поведение)."""
    from app.core.config import settings
    from app.services.scrapers.avito import AvitoScraper

    monkeypatch.setattr(settings, "avito_serp_ekb_only", False)

    ekb_card = _make_card_html("EKB1", "ekaterinburg")
    msk_card = _make_card_html("MSK1", "moskva")

    html = _build_serp_html(ekb_card, msk_card)

    scraper = AvitoScraper()
    lots = scraper._parse_html(html, source_url_base="https://www.avito.ru/ekaterinburg/kvartiry/")

    source_ids = {lot.source_id for lot in lots}
    assert "EKB1" in source_ids
    assert "MSK1" in source_ids
    assert len(lots) == 2


# ---------------------------------------------------------------------------
# 3. Карточка без city-slug → консервативно пропускается (не дропается)
# ---------------------------------------------------------------------------


def test_geo_filter_keeps_card_without_city_slug(monkeypatch: pytest.MonkeyPatch) -> None:
    """Карточка с href без city-slug (/kvartiry/...) пропускается консервативно."""
    from app.core.config import settings
    from app.services.scrapers.avito import AvitoScraper

    monkeypatch.setattr(settings, "avito_serp_ekb_only", True)

    # href без city-slug: первый сегмент = "kvartiry" → non-city, консервативно берём
    no_city_card = """
    <div data-marker="item" data-item-id="NOCITY">
        <a data-marker="item-title" href="/kvartiry/test-99999">2-к. квартира, 50 м², 3/9 эт.</a>
        <meta itemprop="price" content="5000000"/>
        <div data-marker="item-location"><p>ул. Тестовая, 1</p></div>
    </div>
    """
    msk_card = _make_card_html("MSK1", "moskva")

    html = _build_serp_html(no_city_card, msk_card)

    scraper = AvitoScraper()
    lots = scraper._parse_html(html, source_url_base="https://www.avito.ru/ekaterinburg/kvartiry/")

    source_ids = {lot.source_id for lot in lots}
    assert "NOCITY" in source_ids, "Карточка без city-slug должна быть сохранена консервативно"
    assert "MSK1" not in source_ids, "Московская карточка должна быть отброшена"


# ---------------------------------------------------------------------------
# 4. Только EKB карточки → всё проходит
# ---------------------------------------------------------------------------


def test_geo_filter_all_ekb_no_drops(monkeypatch: pytest.MonkeyPatch) -> None:
    """Если все карточки из ЕКБ — dropped=0, все лоты сохраняются."""
    from app.core.config import settings
    from app.services.scrapers.avito import AvitoScraper

    monkeypatch.setattr(settings, "avito_serp_ekb_only", True)

    cards = [_make_card_html(f"EKB{i}", "ekaterinburg") for i in range(3)]
    html = _build_serp_html(*cards)

    scraper = AvitoScraper()
    lots = scraper._parse_html(html, source_url_base="https://www.avito.ru/ekaterinburg/kvartiry/")

    assert len(lots) == 3
    assert all("EKB" in (lot.source_id or "") for lot in lots)
