"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from __future__ import annotations
from anncsu.common.sdk.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
import pydantic
from pydantic import model_serializer
from typing import List, Optional
from typing_extensions import Annotated, NotRequired, TypedDict


class DatiTypedDict(TypedDict):
    progr_civico: NotRequired[str]
    r"""Progressivo civico"""
    codice_civico_comunale: NotRequired[Nullable[str]]
    r"""Codifica comunale dell'accesso"""
    numero: NotRequired[str]
    r"""Numero civico"""
    esponente: NotRequired[str]
    specificita: NotRequired[str]
    metrico: NotRequired[str]
    r"""Metrico"""
    sez_censimento: NotRequired[str]
    r"""Sezione di censimento"""
    data_inizio: NotRequired[str]
    r"""Data di inizio validità"""
    data_fine: NotRequired[str]
    r"""Data di fine validità"""
    progr_nazionale: NotRequired[str]
    r"""Progressivo nazionale"""
    codcom: NotRequired[str]
    r"""Codice comune"""
    coordinata_x_comune: NotRequired[str]
    r"""Coordinata X comune"""
    coordinata_y_comune: NotRequired[str]
    r"""Coordinata Y comune"""
    coordinata_z_comune: NotRequired[str]
    r"""Quota del comune"""
    metodo: NotRequired[Nullable[str]]
    data_ini_valid_amm: NotRequired[Nullable[str]]
    r"""Data di inizio validità amministrativa."""
    data_fine_valid_amm: NotRequired[Nullable[str]]
    r"""Data di fine validità amministrativa."""
    isolato: NotRequired[Nullable[str]]
    r"""Codice isolato, facoltativo, da valorizzare solo per operazione_civico='I','R'"""


class Dati(BaseModel):
    progr_civico: Optional[str] = None
    r"""Progressivo civico"""

    codice_civico_comunale: OptionalNullable[str] = UNSET
    r"""Codifica comunale dell'accesso"""

    numero: Optional[str] = None
    r"""Numero civico"""

    esponente: Optional[str] = None

    specificita: Optional[str] = None

    metrico: Optional[str] = None
    r"""Metrico"""

    sez_censimento: Optional[str] = None
    r"""Sezione di censimento"""

    data_inizio: Optional[str] = None
    r"""Data di inizio validità"""

    data_fine: Optional[str] = None
    r"""Data di fine validità"""

    progr_nazionale: Optional[str] = None
    r"""Progressivo nazionale"""

    codcom: Optional[str] = None
    r"""Codice comune"""

    coordinata_x_comune: Optional[str] = None
    r"""Coordinata X comune"""

    coordinata_y_comune: Optional[str] = None
    r"""Coordinata Y comune"""

    coordinata_z_comune: Optional[str] = None
    r"""Quota del comune"""

    metodo: OptionalNullable[str] = UNSET

    data_ini_valid_amm: OptionalNullable[str] = UNSET
    r"""Data di inizio validità amministrativa."""

    data_fine_valid_amm: OptionalNullable[str] = UNSET
    r"""Data di fine validità amministrativa."""

    isolato: OptionalNullable[str] = UNSET
    r"""Codice isolato, facoltativo, da valorizzare solo per operazione_civico='I','R'"""

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "progr_civico",
                "codice_civico_comunale",
                "numero",
                "esponente",
                "specificita",
                "metrico",
                "sez_censimento",
                "data_inizio",
                "data_fine",
                "progr_nazionale",
                "codcom",
                "coordinata_x_comune",
                "coordinata_y_comune",
                "coordinata_z_comune",
                "metodo",
                "data_ini_valid_amm",
                "data_fine_valid_amm",
                "isolato",
            ]
        )
        nullable_fields = set(
            [
                "codice_civico_comunale",
                "metodo",
                "data_ini_valid_amm",
                "data_fine_valid_amm",
                "isolato",
            ]
        )
        serialized = handler(self)
        m = {}

        for n, f in type(self).model_fields.items():
            k = f.alias or n
            val = serialized.get(k)
            is_nullable_and_explicitly_set = (
                k in nullable_fields
                and (self.__pydantic_fields_set__.intersection({n}))  # pylint: disable=no-member
            )

            if val != UNSET_SENTINEL:
                if (
                    val is not None
                    or k not in optional_fields
                    or is_nullable_and_explicitly_set
                ):
                    m[k] = val

        return m


class RispostaOperazioneTypedDict(TypedDict):
    id_richiesta: NotRequired[str]
    r"""Identificativo assegnato alla richiesta"""
    esito: NotRequired[str]
    r"""Esito dell'operazione"""
    messaggio: NotRequired[str]
    r"""Messaggio associato all'esito"""
    dati: NotRequired[List[DatiTypedDict]]


class RispostaOperazione(BaseModel):
    id_richiesta: Annotated[Optional[str], pydantic.Field(alias="idRichiesta")] = None
    r"""Identificativo assegnato alla richiesta"""

    esito: Optional[str] = None
    r"""Esito dell'operazione"""

    messaggio: Optional[str] = None
    r"""Messaggio associato all'esito"""

    dati: Optional[List[Dati]] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["idRichiesta", "esito", "messaggio", "dati"])
        serialized = handler(self)
        m = {}

        for n, f in type(self).model_fields.items():
            k = f.alias or n
            val = serialized.get(k)

            if val != UNSET_SENTINEL:
                if val is not None or k not in optional_fields:
                    m[k] = val

        return m
