"""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,
)
from pydantic import model_serializer
from typing import Optional
from typing_extensions import NotRequired, TypedDict


class CoordinateTypedDict(TypedDict):
    x: NotRequired[Nullable[str]]
    r"""Coordinata X, obbligatoria se viene valorizzata Y. (Valori ammessi in Italia 6.0 ≤ x ≤ 18.0)"""
    y: NotRequired[Nullable[str]]
    r"""Coordinata Y, obbligatoria se viene valorizzata X. (Valori ammessi in Italia 36.0 ≤ y ≤ 47.0)"""
    z: NotRequired[Nullable[str]]
    r"""Quota, da non valorizzare in assenza di X e Y, espressa in metri"""
    metodo: NotRequired[Nullable[str]]
    r"""Metodo di rilevazione, da non valorizzare in assenza di X e Y. (Valori ammessi da 1 a 4)"""


class Coordinate(BaseModel):
    x: OptionalNullable[str] = UNSET
    r"""Coordinata X, obbligatoria se viene valorizzata Y. (Valori ammessi in Italia 6.0 ≤ x ≤ 18.0)"""

    y: OptionalNullable[str] = UNSET
    r"""Coordinata Y, obbligatoria se viene valorizzata X. (Valori ammessi in Italia 36.0 ≤ y ≤ 47.0)"""

    z: OptionalNullable[str] = UNSET
    r"""Quota, da non valorizzare in assenza di X e Y, espressa in metri"""

    metodo: OptionalNullable[str] = UNSET
    r"""Metodo di rilevazione, da non valorizzare in assenza di X e Y. (Valori ammessi da 1 a 4)"""

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["x", "y", "z", "metodo"])
        nullable_fields = set(["x", "y", "z", "metodo"])
        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 AccessoTypedDict(TypedDict):
    codcom: NotRequired[str]
    r"""Codice del comune (obbligatorio)"""
    progr_civico: NotRequired[str]
    r"""Progressivo accesso"""
    coordinate: NotRequired[CoordinateTypedDict]


class Accesso(BaseModel):
    codcom: Optional[str] = None
    r"""Codice del comune (obbligatorio)"""

    progr_civico: Optional[str] = None
    r"""Progressivo accesso"""

    coordinate: Optional[Coordinate] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["codcom", "progr_civico", "coordinate"])
        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


class RichiestaTypedDict(TypedDict):
    accesso: NotRequired[AccessoTypedDict]


class Richiesta(BaseModel):
    accesso: Optional[Accesso] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["accesso"])
        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


class RichiestaOperazioneTypedDict(TypedDict):
    richiesta: NotRequired[RichiestaTypedDict]


class RichiestaOperazione(BaseModel):
    richiesta: Optional[Richiesta] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["richiesta"])
        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
