"""Тесты общего seed price-brackets констант (avito/cian/yandex)."""

from itertools import pairwise

from app.services.scrapers.price_brackets import (
    _EKB_SECONDARY,
    CITY_PRICE_SEED_BRACKETS,
    get_price_seed_brackets,
)


def test_default_returns_ekb():
    """get_price_seed_brackets() без аргумента возвращает EKB-сетку."""
    assert get_price_seed_brackets() == _EKB_SECONDARY
    assert get_price_seed_brackets("ekaterinburg") == _EKB_SECONDARY


def test_unknown_city_falls_back_to_ekb():
    """Неизвестный город → fallback на EKB (не KeyError)."""
    assert get_price_seed_brackets("atlantis") == _EKB_SECONDARY


def test_last_bracket_is_open():
    """Последний брекет ОТКРЫТ (hi=None) — catch-all хвоста люкса без потолка."""
    brackets = get_price_seed_brackets()
    assert brackets[-1][1] is None
    # Только последний брекет открыт — остальные закрыты.
    for lo, hi in brackets[:-1]:
        assert hi is not None
        assert hi > lo


def test_brackets_are_contiguous():
    """Закрытые брекеты соприкасаются: hi[i] == lo[i+1] (без дыр/перекрытий)."""
    brackets = get_price_seed_brackets()
    for (lo, hi), (next_lo, _next_hi) in pairwise(brackets):
        assert hi == next_lo, f"разрыв между [{lo},{hi}] и [{next_lo},...]"


def test_first_bracket_starts_at_zero():
    """Первый брекет стартует с 0 (вся вторичка с нижнего края)."""
    assert get_price_seed_brackets()[0][0] == 0


def test_city_dict_contains_ekaterinburg():
    """City-dict готов под multi-city — сейчас единственный ключ ekaterinburg."""
    assert "ekaterinburg" in CITY_PRICE_SEED_BRACKETS
    assert CITY_PRICE_SEED_BRACKETS["ekaterinburg"] is _EKB_SECONDARY
