"""Тесты `_poi_detail_from_tags` / `_clean_tag` — обогащение POI-точек §1 карты
«максимумом информации» из OSM tags jsonb (адрес, оператор, часы, сайт, телефон).

Покрывает:
(a) полный набор тегов → все поля заполнены, адрес склеен «улица, дом»;
(b) приоритет contact:* над «голым» website/phone, brand как fallback оператора;
(c) фиксированный набор ключей (всегда 5) с None при отсутствии тега;
(d) мусорные значения («yes», пустые строки, не-строки) отбрасываются.
"""

from __future__ import annotations

from app.api.v1.parcels import _clean_tag, _poi_detail_from_tags

_KEYS = {"address", "operator", "opening_hours", "website", "phone"}


def test_full_tags_all_fields_populated() -> None:
    out = _poi_detail_from_tags(
        {
            "addr:street": "улица Маяковского",
            "addr:housenumber": "12",
            "operator": 'ООО "Аптека+"',
            "opening_hours": "Mo-Su 08:00-22:00",
            "contact:website": "https://apteka.example",
            "contact:phone": "+7 343 000-00-00",
        }
    )
    assert set(out) == _KEYS
    assert out["address"] == "улица Маяковского, 12"
    assert out["operator"] == 'ООО "Аптека+"'
    assert out["opening_hours"] == "Mo-Su 08:00-22:00"
    assert out["website"] == "https://apteka.example"
    assert out["phone"] == "+7 343 000-00-00"


def test_contact_priority_and_brand_fallback() -> None:
    out = _poi_detail_from_tags(
        {
            "brand": "Пятёрочка",  # operator отсутствует → берём brand
            "website": "http://bare.example",
            "contact:website": "https://contact.example",  # приоритетнее
            "phone": "+7 000",
            "contact:phone": "+7 111",  # приоритетнее
        }
    )
    assert out["operator"] == "Пятёрочка"
    assert out["website"] == "https://contact.example"
    assert out["phone"] == "+7 111"
    assert out["address"] is None


def test_fixed_keyset_with_none_when_absent() -> None:
    for tags in (None, {}, {"amenity": "pharmacy"}):
        out = _poi_detail_from_tags(tags)
        assert set(out) == _KEYS
        assert all(v is None for v in out.values())


def test_house_only_address() -> None:
    assert _poi_detail_from_tags({"addr:housenumber": "5А"})["address"] == "5А"


def test_clean_tag_drops_junk() -> None:
    assert _clean_tag("yes") is None
    assert _clean_tag("  ") is None
    assert _clean_tag(None) is None
    assert _clean_tag(123) is None
    assert _clean_tag("  Реальное значение ") == "Реальное значение"
