"""Build ElementTree nodes from validated ISTAT XML payloads."""

from __future__ import annotations

from collections.abc import Iterable
from xml.etree import ElementTree

from istat.xml_export.exceptions import XmlSerializationError
from istat.xml_export.payloads.guest_payload import IstatXmlGuestPayload
from istat.xml_export.xml.xml_utils import append_text_node, format_xml_date


ROOT_TAG = "MOVIMENTI"
MOVEMENT_TAG = "MOVIMENTO"


def build_xml_tree(payloads: Iterable[IstatXmlGuestPayload]) -> ElementTree.Element:
    """Build the deterministic XML tree for a payload collection."""
    root = ElementTree.Element(ROOT_TAG)
    for payload in payloads:
        root.append(serialize_guest_payload(payload))
    return root


def serialize_guest_payload(payload: IstatXmlGuestPayload) -> ElementTree.Element:
    """Build a single movement node in explicit, deterministic tag order."""
    if not isinstance(payload, IstatXmlGuestPayload):
        raise XmlSerializationError("Expected IstatXmlGuestPayload instance")

    movimento = ElementTree.Element(MOVEMENT_TAG)

    append_text_node(movimento, "DATAARRIVO", format_xml_date(payload.arrival_date))
    append_text_node(movimento, "DATAPARTENZA", format_xml_date(payload.departure_date))
    append_text_node(movimento, "SESSO", payload.gender)
    append_text_node(movimento, "TIPOCLIENTE", payload.guest_type)
    append_text_node(
        movimento,
        "RESIDENZA_ITALIANA",
        "S" if payload.is_italian_resident else "N",
    )

    if payload.is_italian_resident:
        append_text_node(movimento, "COD_PROVINCIA", payload.province_code)
        append_text_node(movimento, "COD_REGIONE", payload.region_code)
    else:
        append_text_node(movimento, "COD_STATO_ESTERO", payload.residence_country_code)

    return movimento
