from __future__ import annotations

from osm_lead_source_service.domain.enums import OsmObjectType, ProfileEligibilityState
from osm_lead_source_service.domain.models import OsmIdentity, ProfileVersion
from osm_lead_source_service.pbf import ParsedOsmObject
from osm_lead_source_service.profiles import (
    ProfileEvaluator,
    ProfileLifecycleState,
    builtin_profile_registry,
)


def parsed(osm_id: int, *tags: tuple[str, str]) -> ParsedOsmObject:
    return ParsedOsmObject(
        identity=OsmIdentity(OsmObjectType.NODE, osm_id),
        version=1,
        tags=tags,
        longitude_e7=1,
        latitude_e7=1,
    )


def test_production_profiles_are_draft_and_noninsertable() -> None:
    registry = builtin_profile_registry()
    for profile in (
        ProfileVersion("luxeillum", "0.1.0-draft"),
        ProfileVersion("saas_redesign", "0.1.0-draft"),
    ):
        definition = registry.get(profile)
        assert definition.lifecycle_state is ProfileLifecycleState.DRAFT
        assert definition.shadow_only is False
        assert definition.production_insert_allowed is False
        assert "draft_fixture:not_approved_for_targeting" in definition.provenance


def test_legacy_parity_is_shadow_only_and_source_pinned() -> None:
    definition = builtin_profile_registry().get(
        ProfileVersion("legacy_parity", "2026-06-19-curated")
    )
    assert definition.lifecycle_state is ProfileLifecycleState.DRAFT
    assert definition.shadow_only is True
    assert definition.production_insert_allowed is False
    assert "commit:43b3d6fb699276ede19fb633f75f1d31f5ff32d1" in definition.provenance
    assert "selector_blob:7942e2c962485671b7eefa71eb9665e048ad6697" in definition.provenance
    assert "dynamic_ontology_alias_expansion:not_snapshotted" in definition.provenance
    assert (
        "activation_blocked:complete_compiled_selector_snapshot_required" in definition.provenance
    )


def test_luxeillum_fast_food_exclusion_is_explicit() -> None:
    registry = builtin_profile_registry()
    profile = ProfileVersion("luxeillum", "0.1.0-draft")
    decision = ProfileEvaluator(registry).evaluate(
        region_id="th",
        parsed_object=parsed(1, ("amenity", "fast_food")),
        profile=profile,
    )
    assert decision.state is ProfileEligibilityState.EXCLUDED


def test_luxeillum_accommodation_priority_resolves_mixed_use_object() -> None:
    profile = ProfileVersion("luxeillum", "0.1.0-draft")
    decision = ProfileEvaluator(builtin_profile_registry()).evaluate(
        region_id="au-act",
        parsed_object=parsed(
            50637165,
            ("amenity", "restaurant"),
            ("tourism", "apartment"),
        ),
        profile=profile,
    )
    assert decision.state is ProfileEligibilityState.ACTIVE
    assert decision.category == "Hospitality"
    assert decision.subcategory == "Accommodation"
    assert "suppressed_by_priority:luxeillum.hospitality.restaurant" in decision.evidence


def test_legacy_curated_restaurant_matches_shadow_profile() -> None:
    profile = ProfileVersion("legacy_parity", "2026-06-19-curated")
    decision = ProfileEvaluator(builtin_profile_registry()).evaluate(
        region_id="us",
        parsed_object=parsed(1, ("amenity", "restaurant")),
        profile=profile,
    )
    assert decision.state is ProfileEligibilityState.ACTIVE
    assert decision.category == "Legacy parity"
    assert decision.subcategory == "Restaurants"
    assert decision.production_insert_allowed is False
