# This file was generated by liblab | https://liblab.com/

from __future__ import annotations
from typing import List
from .utils.json_map import JsonMap
from .base import BaseModel
from .translated_string import TranslatedString
from .checkin_checkout_times_dto import CheckinCheckoutTimesDto
from .contacts_dto import ContactsDto
from .facility_dto import FacilityDto
from .description_dto import DescriptionDto
from .key_collection_information_dto import KeyCollectionInformationDto
from .location_dto import LocationDto
from .payment_dto import PaymentDto
from .photo_dto import PhotoDto
from .policies_dto import PoliciesDto
from .program_settings_dto import ProgramSettingsDto
from .rating_dto import RatingDto
from .room_dto import RoomDto


@JsonMap({"id_": "id"})
class DetailsOutputDto(BaseModel):
    """DetailsOutputDto

    :param id_: A signed integer number that uniquely identifies an accommodation property., defaults to None
    :type id_: int, optional
    :param name: Translated description of this room. The maximum number of characters returned may be limited by contract., defaults to None
    :type name: TranslatedString, optional
    :param accommodation_type: A signed integer number that uniquely identifies an accommodation property type.<br>Examples of accommodation types are: Apartment, Hostel, Hotel etc., defaults to None
    :type accommodation_type: int, optional
    :param brands: A signed integer number that uniquely identifies an accommodation brand., defaults to None
    :type brands: List[int], optional
    :param checkin_checkout_times: checkin_checkout_times, defaults to None
    :type checkin_checkout_times: CheckinCheckoutTimesDto, optional
    :param contacts: Contact information of the accommodation., defaults to None
    :type contacts: ContactsDto, optional
    :param currency: A three-letter code that uniquely identifies a monetary currency as defined by the ISO 4217 standard., defaults to None
    :type currency: str, optional
    :param facilities: The list of facilities available in this property. Requires `{"extras":["facilities"]}`., defaults to None
    :type facilities: List[FacilityDto], optional
    :param deep_link_url: Deep link mobile app URL., defaults to None
    :type deep_link_url: str, optional
    :param description: Textual information about the accommodation. Requires `{"extras":["description"]}`., defaults to None
    :type description: DescriptionDto, optional
    :param is_work_friendly: Flags if this accommodation is work friendly., defaults to None
    :type is_work_friendly: bool, optional
    :param key_collection_information: key_collection_information, defaults to None
    :type key_collection_information: List[KeyCollectionInformationDto], optional
    :param location: All location related information of this accommodation property., defaults to None
    :type location: LocationDto, optional
    :param number_of_rooms: Total number of rooms in the property.<br>Please note that this is not an availability call and that this number is mostly used to determine the size and type of a property.<br>, defaults to None
    :type number_of_rooms: int, optional
    :param payment: Payment terms and conditions for this product., defaults to None
    :type payment: PaymentDto, optional
    :param photos: List of photos for this accommodation property.The maximum number of photos returned may be limited by contract.<br>Requires `{"extras":["photos"]}`. The photos are returned in no particular order., defaults to None
    :type photos: List[PhotoDto], optional
    :param policies: The policies for this product., defaults to None
    :type policies: PoliciesDto, optional
    :param price_category: Indicates the qualitative price reference (between $ and $$$$) on how expensive an accommodation is.<br>Accommodations in the same city are sorted by ascending price (average per guest per night in the last month),<br>the ones in the lowest 25 percentile are in category $, between 25 and 50 percentile are in category $$,<br>between 50 and 75 percentile are in category $$$, remaining ones are in category $$$$., defaults to None
    :type price_category: str, optional
    :param programmes: Details of programmes undergone by the property., defaults to None
    :type programmes: ProgramSettingsDto, optional
    :param rating: rating, defaults to None
    :type rating: RatingDto, optional
    :param rooms: The list of room types available at this property. Requires `{"extras":["rooms"]}`., defaults to None
    :type rooms: List[RoomDto], optional
    :param spoken_languages: spoken_languages, defaults to None
    :type spoken_languages: List[str], optional
    :param themes: themes, defaults to None
    :type themes: List[int], optional
    :param url: url, defaults to None
    :type url: str, optional
    """

    def __init__(
        self,
        id_: int = None,
        name: TranslatedString = None,
        accommodation_type: int = None,
        brands: List[int] = None,
        checkin_checkout_times: CheckinCheckoutTimesDto = None,
        contacts: ContactsDto = None,
        currency: str = None,
        facilities: List[FacilityDto] = None,
        deep_link_url: str = None,
        description: DescriptionDto = None,
        is_work_friendly: bool = None,
        key_collection_information: List[KeyCollectionInformationDto] = None,
        location: LocationDto = None,
        number_of_rooms: int = None,
        payment: PaymentDto = None,
        photos: List[PhotoDto] = None,
        policies: PoliciesDto = None,
        price_category: str = None,
        programmes: ProgramSettingsDto = None,
        rating: RatingDto = None,
        rooms: List[RoomDto] = None,
        spoken_languages: List[str] = None,
        themes: List[int] = None,
        url: str = None,
    ):
        if id_ is not None:
            self.id_ = id_
        if name is not None:
            self.name = self._define_object(name, TranslatedString)
        if accommodation_type is not None:
            self.accommodation_type = accommodation_type
        if brands is not None:
            self.brands = brands
        if checkin_checkout_times is not None:
            self.checkin_checkout_times = self._define_object(
                checkin_checkout_times, CheckinCheckoutTimesDto
            )
        if contacts is not None:
            self.contacts = self._define_object(contacts, ContactsDto)
        if currency is not None:
            self.currency = self._pattern_matching(currency, "^[A-Z]{3}$", "currency")
        if facilities is not None:
            self.facilities = self._define_list(facilities, FacilityDto)
        if deep_link_url is not None:
            self.deep_link_url = deep_link_url
        if description is not None:
            self.description = self._define_object(description, DescriptionDto)
        if is_work_friendly is not None:
            self.is_work_friendly = is_work_friendly
        if key_collection_information is not None:
            self.key_collection_information = self._define_list(
                key_collection_information, KeyCollectionInformationDto
            )
        if location is not None:
            self.location = self._define_object(location, LocationDto)
        if number_of_rooms is not None:
            self.number_of_rooms = number_of_rooms
        if payment is not None:
            self.payment = self._define_object(payment, PaymentDto)
        if photos is not None:
            self.photos = self._define_list(photos, PhotoDto)
        if policies is not None:
            self.policies = self._define_object(policies, PoliciesDto)
        if price_category is not None:
            self.price_category = self._pattern_matching(
                price_category, "[$]{0,4}", "price_category"
            )
        if programmes is not None:
            self.programmes = self._define_object(programmes, ProgramSettingsDto)
        if rating is not None:
            self.rating = self._define_object(rating, RatingDto)
        if rooms is not None:
            self.rooms = self._define_list(rooms, RoomDto)
        if spoken_languages is not None:
            self.spoken_languages = spoken_languages
        if themes is not None:
            self.themes = themes
        if url is not None:
            self.url = url
