from __future__ import annotations

import pytest

from osm_lead_source_service.errors import ContractViolation
from osm_lead_source_service.pbf.tags import canonicalize_osm_tags


def test_canonical_lowercase_key_wins_casefold_collision() -> None:
    tags = (("Amenity", "school"), ("amenity", "restaurant"))

    first = canonicalize_osm_tags(tags)
    second = canonicalize_osm_tags(reversed(tags))

    assert first == second == {"amenity": "restaurant"}


def test_noncanonical_collision_is_order_independent() -> None:
    tags = (("Name", "Zulu"), ("NAME", "Alpha"))

    first = canonicalize_osm_tags(tags)
    second = canonicalize_osm_tags(reversed(tags))

    assert first == second == {"name": "Alpha"}


def test_exact_duplicate_key_uses_deterministic_value() -> None:
    canonical = canonicalize_osm_tags((("name", "Zulu"), ("name", "Alpha")))

    assert canonical == {"name": "Alpha"}


def test_tag_canonicalization_preserves_bounds() -> None:
    with pytest.raises(ContractViolation, match="tag key cannot be blank"):
        canonicalize_osm_tags((("  ", "value"),))
    with pytest.raises(ContractViolation, match="tag key exceeds"):
        canonicalize_osm_tags((("x" * 257, "value"),))
    with pytest.raises(ContractViolation, match="tag value exceeds"):
        canonicalize_osm_tags((("name", "x" * 4097),))
