from django.test import SimpleTestCase
from types import SimpleNamespace

from checkin.default_fields import (
    DEFAULT_ADDITIONAL_GUEST_FIELDS,
    DEFAULT_MAIN_GUEST_FIELDS,
)
from checkin.utils import flatten_default_fields
from checkin.views import _normalize_istat_birth_fields
from istat.xml_export.builders.payload_builder import (
    _get_guest_city,
    _get_guest_province,
)
from services.istat_export_service import (
    _birth_city_source,
    _residence_municipality_source,
    _residence_province_source,
)


EXPECTED_ISTAT_LABELS = {
    "place_of_birth": "Birth Municipality / City",
    "city": "Residence Municipality / City",
    "province": "Province of Residence",
    "country": "Country of Residence",
    "country_of_birth": "Country of Birth",
    "nationality": "Nationality",
}


def _labels_by_slug(grouped_fields):
    labels = {}
    for category in grouped_fields:
        for field in category["fields"]:
            labels[field["slug"]] = field["label"]
    return labels


class DefaultCheckinFieldLabelTests(SimpleTestCase):
    def test_main_and_additional_guest_labels_are_consistent(self):
        for grouped_fields in (
            DEFAULT_MAIN_GUEST_FIELDS,
            DEFAULT_ADDITIONAL_GUEST_FIELDS,
        ):
            labels = _labels_by_slug(grouped_fields)
            for slug, expected_label in EXPECTED_ISTAT_LABELS.items():
                self.assertEqual(labels[slug], expected_label)

    def test_flatten_default_fields_preserves_slugs_and_labels(self):
        flattened = flatten_default_fields(DEFAULT_MAIN_GUEST_FIELDS, "main_guest")
        fields_by_slug = {field["slug"]: field for field in flattened}

        for slug, expected_label in EXPECTED_ISTAT_LABELS.items():
            self.assertIn(slug, fields_by_slug)
            self.assertEqual(fields_by_slug[slug]["label"], expected_label)
            self.assertEqual(fields_by_slug[slug]["slug"], slug)

    def test_legacy_birth_field_normalizer_updates_label_only(self):
        fields = [
            {
                "slug": "place_of_birth",
                "label": "Birth municipality / city",
                "type": "text",
                "required": False,
                "category": "Personal info",
            }
        ]

        normalized = _normalize_istat_birth_fields(fields)
        normalized_by_slug = {field["slug"]: field for field in normalized}

        self.assertEqual(
            normalized_by_slug["place_of_birth"]["label"],
            "Birth Municipality / City",
        )
        self.assertEqual(
            normalized_by_slug["country_of_birth"]["label"],
            "Country of Birth",
        )

    def test_txt_export_helpers_use_slugs_not_labels(self):
        guest = SimpleNamespace(
            city="Bologna",
            region="ER",
            extra_data={
                "place_of_birth": "Alessandria",
                "province": "BO",
            },
        )
        extra = guest.extra_data

        self.assertEqual(_birth_city_source(guest, extra), "Alessandria")
        self.assertEqual(_residence_municipality_source(guest, extra), "Bologna")
        self.assertEqual(_residence_province_source(guest, extra), "BO")

    def test_xml_export_helpers_use_residence_slugs_not_labels(self):
        guest = SimpleNamespace(
            city="Bologna",
            region="ER",
            extra_data={
                "place_of_birth": "Alessandria",
                "province": "BO",
            },
        )

        self.assertEqual(_get_guest_city(guest), "Bologna")
        self.assertEqual(_get_guest_province(guest), "BO")
