# 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. 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. 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. , 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. 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. Accommodations in the same city are sorted by ascending price (average per guest per night in the last month), the ones in the lowest 25 percentile are in category $, between 25 and 50 percentile are in category $$, 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
