"""Tests for Ross1000 9-digit country code resolution."""

from __future__ import annotations

import pytest

from istat.ross1000.models.country_codes import (
    ITALY_9DIGIT_CODE,
    ROSS1000_COUNTRY_CODES,
    get_ross1000_country_code,
)


class TestGetRoss1000CountryCode:
    def test_italy_returns_correct_9digit_code(self):
        assert get_ross1000_country_code("IT") == "100000100"

    def test_italy_constant_matches_mapping(self):
        assert ITALY_9DIGIT_CODE == get_ross1000_country_code("IT")

    def test_germany_returns_correct_code(self):
        assert get_ross1000_country_code("DE") == "200000004"

    def test_france_returns_correct_code(self):
        assert get_ross1000_country_code("FR") == "200000001"

    def test_usa_returns_correct_code(self):
        assert get_ross1000_country_code("US") == "400000400"

    def test_china_returns_correct_code(self):
        assert get_ross1000_country_code("CN") == "300000720"

    def test_lowercase_iso2_is_normalized(self):
        assert get_ross1000_country_code("it") == "100000100"
        assert get_ross1000_country_code("de") == "200000004"

    def test_mixed_case_iso2_is_normalized(self):
        assert get_ross1000_country_code("It") == "100000100"

    def test_unknown_code_returns_none(self):
        assert get_ross1000_country_code("ZZ") is None

    def test_none_input_returns_none(self):
        assert get_ross1000_country_code(None) is None

    def test_empty_string_returns_none(self):
        assert get_ross1000_country_code("") is None

    def test_whitespace_only_returns_none(self):
        assert get_ross1000_country_code("  ") is None

    def test_kosovo_fallback_to_serbia(self):
        # XK (Kosovo) → Serbia code
        assert get_ross1000_country_code("XK") == "200000098"

    def test_aland_fallback_to_finland(self):
        assert get_ross1000_country_code("AX") == "200000032"

    def test_south_sudan_fallback_to_sudan(self):
        assert get_ross1000_country_code("SS") == "500000224"

    def test_all_codes_are_9_digits(self):
        for iso2, code in ROSS1000_COUNTRY_CODES.items():
            assert len(code) == 9 and code.isdigit(), (
                f"Code for {iso2} is '{code}' — expected 9 digits"
            )

    def test_all_codes_are_strings(self):
        for iso2, code in ROSS1000_COUNTRY_CODES.items():
            assert isinstance(code, str), f"Code for {iso2} is not a string"
