from src.domain.projects.router import _normalize_form_policy
from src.domain.projects.schemas import FormPolicyUpdate
from src.domain.reference_data.catalog import (
    countries,
    currencies,
    languages,
    normalize_country_codes,
    subdivisions,
    timezones,
)


def test_catalog_includes_country_flags_and_dialing_codes() -> None:
    canada = next(country for country in countries() if country["code"] == "CA")

    assert canada["name"] == "Canada"
    assert canada["flag"] == "🇨🇦"
    assert "+1" in canada["calling_codes"]


def test_catalog_exposes_us_and_canadian_subdivisions() -> None:
    assert any(item["code"] == "US-CA" for item in subdivisions("US"))
    assert any(item["code"] == "CA-ON" for item in subdivisions("CA"))


def test_catalog_exposes_currency_decimal_digits() -> None:
    by_code = {row["code"]: row for row in currencies()}

    assert by_code["USD"]["decimal_digits"] == 2
    assert by_code["JPY"]["decimal_digits"] == 0
    assert by_code["BHD"]["decimal_digits"] == 3


def test_catalog_exposes_iso_639_1_languages_only() -> None:
    by_code = {row["code"]: row for row in languages()}

    assert by_code["en"]["name"] == "English"
    assert all(len(code) == 2 for code in by_code)


def test_catalog_exposes_timezones_with_utc_offset_and_no_legacy_aliases() -> None:
    by_id = {row["id"]: row for row in timezones()}

    assert "America/New_York" in by_id
    assert isinstance(by_id["America/New_York"]["utc_offset_minutes"], int)
    assert "US/Eastern" not in by_id


def test_form_policy_requires_a_country_list_for_restricted_modes() -> None:
    body = FormPolicyUpdate(country_mode="include", countries=["ca", "us"], default_country="ca")

    assert _normalize_form_policy(body) == {
        "country_mode": "include",
        "countries": ["CA", "US"],
        "default_country": "CA",
        "require_subdivision": False,
        "phone_country_selector": True,
    }
    assert normalize_country_codes(["ca", "CA", "us"]) == ["CA", "US"]
