# This file was auto-generated by Fern from our API Definition.

import datetime as dt
import typing

from ..core.datetime_utils import serialize_datetime
from .appointment_event_status import AppointmentEventStatus
from .appointment_provider import AppointmentProvider
from .appointment_status import AppointmentStatus
from .appointment_type import AppointmentType
from .client_facing_appointment_event import ClientFacingAppointmentEvent
from .lng_lat import LngLat
from .us_address import UsAddress

try:
    import pydantic.v1 as pydantic  # type: ignore
except ImportError:
    import pydantic  # type: ignore


class ClientFacingAppointment(pydantic.BaseModel):
    id: str
    user_id: str
    order_id: str
    address: UsAddress
    location: LngLat
    start_at: dt.datetime = pydantic.Field(description="Time is in UTC")
    end_at: dt.datetime = pydantic.Field(description="Time is in UTC")
    iana_timezone: str
    type: AppointmentType
    provider: AppointmentProvider
    status: AppointmentStatus
    provider_id: str
    can_reschedule: bool
    event_status: AppointmentEventStatus
    event_data: typing.Optional[typing.Dict[str, typing.Any]]
    events: typing.List[ClientFacingAppointmentEvent]

    def json(self, **kwargs: typing.Any) -> str:
        kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
        return super().json(**kwargs_with_defaults)

    def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
        kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
        return super().dict(**kwargs_with_defaults)

    class Config:
        frozen = True
        smart_union = True
        json_encoders = {dt.datetime: serialize_datetime}
