"""Typed C59 aggregation row payloads for Liguria ISTAT XML export.

Each row represents aggregated guest movement statistics grouped by residence
(Italian province or foreign country) for a single reporting day.
"""

from __future__ import annotations

from dataclasses import dataclass


@dataclass(frozen=True, init=False)
class IstatC59RowPayload:
    """Aggregated C59 movement row ready for XML serialization.
    
    Attributes:
        nazione: "i" for Italian residents, "e" for foreign residents
        residenza: 3-digit ISTAT code (province code for Italy, country code for foreign)
        arrivi: Number of guests arriving on this day with this residence
        partenze: Number of guests departing on this day with this residence
        presenze: Number of guests present overnight with this residence
        diurni: Number of same-day arrival/departure guests (default 0)
    """
    
    nazione: str
    residenza: str
    arrivi: int
    partenze: int
    presenze: int
    diurni: int = 0

    def __init__(
        self,
        *,
        nazione: str,
        residenza: str,
        arrivi: int | None = None,
        partenze: int | None = None,
        presenze: int | None = None,
        arrivati: int | None = None,
        partiti: int | None = None,
        presenti: int | None = None,
        diurni: int = 0,
    ):
        object.__setattr__(self, "nazione", nazione)
        object.__setattr__(self, "residenza", residenza)
        object.__setattr__(
            self,
            "arrivi",
            arrivi if arrivi is not None else int(arrivati or 0),
        )
        object.__setattr__(
            self,
            "partenze",
            partenze if partenze is not None else int(partiti or 0),
        )
        object.__setattr__(
            self,
            "presenze",
            presenze if presenze is not None else int(presenti or 0),
        )
        object.__setattr__(self, "diurni", diurni)

    @property
    def arrivati(self) -> int:
        return self.arrivi

    @property
    def partiti(self) -> int:
        return self.partenze

    @property
    def presenti(self) -> int:
        return self.presenze
