# coding: utf-8

from __future__ import absolute_import
from datetime import date, datetime  # noqa: F401

from typing import List, Dict  # noqa: F401

from swagger_server.models.base_model_ import Model
from swagger_server.models.place import Place  # noqa: F401,E501
from swagger_server.models.traveler import Traveler  # noqa: F401,E501
from swagger_server import util


class PlanningRequest(Model):
    """NOTE: This class is auto generated by the swagger code generator program.

    Do not edit the class manually.
    """
    def __init__(self, _from: Place=None, radius: float=None, to: Place=None, estimated_distance: float=None, departure_time: datetime=None, arrival_time: datetime=None, nr_of_travelers: int=None, travelers: List[Traveler]=None, use_assets: List[str]=None, user_groups: List[str]=None, use_asset_types: List[str]=None):  # noqa: E501
        """PlanningRequest - a model defined in Swagger

        :param _from: The _from of this PlanningRequest.  # noqa: E501
        :type _from: Place
        :param radius: The radius of this PlanningRequest.  # noqa: E501
        :type radius: float
        :param to: The to of this PlanningRequest.  # noqa: E501
        :type to: Place
        :param estimated_distance: The estimated_distance of this PlanningRequest.  # noqa: E501
        :type estimated_distance: float
        :param departure_time: The departure_time of this PlanningRequest.  # noqa: E501
        :type departure_time: datetime
        :param arrival_time: The arrival_time of this PlanningRequest.  # noqa: E501
        :type arrival_time: datetime
        :param nr_of_travelers: The nr_of_travelers of this PlanningRequest.  # noqa: E501
        :type nr_of_travelers: int
        :param travelers: The travelers of this PlanningRequest.  # noqa: E501
        :type travelers: List[Traveler]
        :param use_assets: The use_assets of this PlanningRequest.  # noqa: E501
        :type use_assets: List[str]
        :param user_groups: The user_groups of this PlanningRequest.  # noqa: E501
        :type user_groups: List[str]
        :param use_asset_types: The use_asset_types of this PlanningRequest.  # noqa: E501
        :type use_asset_types: List[str]
        """
        self.swagger_types = {
            '_from': Place,
            'radius': float,
            'to': Place,
            'estimated_distance': float,
            'departure_time': datetime,
            'arrival_time': datetime,
            'nr_of_travelers': int,
            'travelers': List[Traveler],
            'use_assets': List[str],
            'user_groups': List[str],
            'use_asset_types': List[str]
        }

        self.attribute_map = {
            '_from': 'from',
            'radius': 'radius',
            'to': 'to',
            'estimated_distance': 'estimatedDistance',
            'departure_time': 'departureTime',
            'arrival_time': 'arrivalTime',
            'nr_of_travelers': 'nrOfTravelers',
            'travelers': 'travelers',
            'use_assets': 'useAssets',
            'user_groups': 'userGroups',
            'use_asset_types': 'useAssetTypes'
        }
        self.__from = _from
        self._radius = radius
        self._to = to
        self._estimated_distance = estimated_distance
        self._departure_time = departure_time
        self._arrival_time = arrival_time
        self._nr_of_travelers = nr_of_travelers
        self._travelers = travelers
        self._use_assets = use_assets
        self._user_groups = user_groups
        self._use_asset_types = use_asset_types

    @classmethod
    def from_dict(cls, dikt) -> 'PlanningRequest':
        """Returns the dict as a model

        :param dikt: A dict.
        :type: dict
        :return: The planningRequest of this PlanningRequest.  # noqa: E501
        :rtype: PlanningRequest
        """
        return util.deserialize_model(dikt, cls)

    @property
    def _from(self) -> Place:
        """Gets the _from of this PlanningRequest.


        :return: The _from of this PlanningRequest.
        :rtype: Place
        """
        return self.__from

    @_from.setter
    def _from(self, _from: Place):
        """Sets the _from of this PlanningRequest.


        :param _from: The _from of this PlanningRequest.
        :type _from: Place
        """
        if _from is None:
            raise ValueError("Invalid value for `_from`, must not be `None`")  # noqa: E501

        self.__from = _from

    @property
    def radius(self) -> float:
        """Gets the radius of this PlanningRequest.

        Maximum distance in meters a user wants to travel to reach the travel option  # noqa: E501

        :return: The radius of this PlanningRequest.
        :rtype: float
        """
        return self._radius

    @radius.setter
    def radius(self, radius: float):
        """Sets the radius of this PlanningRequest.

        Maximum distance in meters a user wants to travel to reach the travel option  # noqa: E501

        :param radius: The radius of this PlanningRequest.
        :type radius: float
        """

        self._radius = radius

    @property
    def to(self) -> Place:
        """Gets the to of this PlanningRequest.


        :return: The to of this PlanningRequest.
        :rtype: Place
        """
        return self._to

    @to.setter
    def to(self, to: Place):
        """Sets the to of this PlanningRequest.


        :param to: The to of this PlanningRequest.
        :type to: Place
        """

        self._to = to

    @property
    def estimated_distance(self) -> float:
        """Gets the estimated_distance of this PlanningRequest.

        instead of using the from/to construct, it is also possible to give an indication of the distance to travel. The process identifier 'USE_ESTIMATED_DISTANCE' is used to indicate this scenario.  # noqa: E501

        :return: The estimated_distance of this PlanningRequest.
        :rtype: float
        """
        return self._estimated_distance

    @estimated_distance.setter
    def estimated_distance(self, estimated_distance: float):
        """Sets the estimated_distance of this PlanningRequest.

        instead of using the from/to construct, it is also possible to give an indication of the distance to travel. The process identifier 'USE_ESTIMATED_DISTANCE' is used to indicate this scenario.  # noqa: E501

        :param estimated_distance: The estimated_distance of this PlanningRequest.
        :type estimated_distance: float
        """

        self._estimated_distance = estimated_distance

    @property
    def departure_time(self) -> datetime:
        """Gets the departure_time of this PlanningRequest.

        The intended departure time. If left out and no arrivalTime is set, the current time should be assumed.  # noqa: E501

        :return: The departure_time of this PlanningRequest.
        :rtype: datetime
        """
        return self._departure_time

    @departure_time.setter
    def departure_time(self, departure_time: datetime):
        """Sets the departure_time of this PlanningRequest.

        The intended departure time. If left out and no arrivalTime is set, the current time should be assumed.  # noqa: E501

        :param departure_time: The departure_time of this PlanningRequest.
        :type departure_time: datetime
        """

        self._departure_time = departure_time

    @property
    def arrival_time(self) -> datetime:
        """Gets the arrival_time of this PlanningRequest.

        The intended arrival time, at the to place if set otherwise the time the user intends to stop using the asset.  # noqa: E501

        :return: The arrival_time of this PlanningRequest.
        :rtype: datetime
        """
        return self._arrival_time

    @arrival_time.setter
    def arrival_time(self, arrival_time: datetime):
        """Sets the arrival_time of this PlanningRequest.

        The intended arrival time, at the to place if set otherwise the time the user intends to stop using the asset.  # noqa: E501

        :param arrival_time: The arrival_time of this PlanningRequest.
        :type arrival_time: datetime
        """

        self._arrival_time = arrival_time

    @property
    def nr_of_travelers(self) -> int:
        """Gets the nr_of_travelers of this PlanningRequest.

        The number of people that intend to travel, including the customer.  # noqa: E501

        :return: The nr_of_travelers of this PlanningRequest.
        :rtype: int
        """
        return self._nr_of_travelers

    @nr_of_travelers.setter
    def nr_of_travelers(self, nr_of_travelers: int):
        """Sets the nr_of_travelers of this PlanningRequest.

        The number of people that intend to travel, including the customer.  # noqa: E501

        :param nr_of_travelers: The nr_of_travelers of this PlanningRequest.
        :type nr_of_travelers: int
        """

        self._nr_of_travelers = nr_of_travelers

    @property
    def travelers(self) -> List[Traveler]:
        """Gets the travelers of this PlanningRequest.

        Extra information about the people that intend to travel if relevant, length must be less than or equal to nrOftravelers.  # noqa: E501

        :return: The travelers of this PlanningRequest.
        :rtype: List[Traveler]
        """
        return self._travelers

    @travelers.setter
    def travelers(self, travelers: List[Traveler]):
        """Sets the travelers of this PlanningRequest.

        Extra information about the people that intend to travel if relevant, length must be less than or equal to nrOftravelers.  # noqa: E501

        :param travelers: The travelers of this PlanningRequest.
        :type travelers: List[Traveler]
        """

        self._travelers = travelers

    @property
    def use_assets(self) -> List[str]:
        """Gets the use_assets of this PlanningRequest.

        The specific asset(s) the user wishes to receive leg options for  # noqa: E501

        :return: The use_assets of this PlanningRequest.
        :rtype: List[str]
        """
        return self._use_assets

    @use_assets.setter
    def use_assets(self, use_assets: List[str]):
        """Sets the use_assets of this PlanningRequest.

        The specific asset(s) the user wishes to receive leg options for  # noqa: E501

        :param use_assets: The use_assets of this PlanningRequest.
        :type use_assets: List[str]
        """

        self._use_assets = use_assets

    @property
    def user_groups(self) -> List[str]:
        """Gets the user_groups of this PlanningRequest.

        Id(s) of user groups that the user belongs to. This provides access to exclusive assets that are hidden to the public. Id's are agreed upon by TO and MP.  # noqa: E501

        :return: The user_groups of this PlanningRequest.
        :rtype: List[str]
        """
        return self._user_groups

    @user_groups.setter
    def user_groups(self, user_groups: List[str]):
        """Sets the user_groups of this PlanningRequest.

        Id(s) of user groups that the user belongs to. This provides access to exclusive assets that are hidden to the public. Id's are agreed upon by TO and MP.  # noqa: E501

        :param user_groups: The user_groups of this PlanningRequest.
        :type user_groups: List[str]
        """

        self._user_groups = user_groups

    @property
    def use_asset_types(self) -> List[str]:
        """Gets the use_asset_types of this PlanningRequest.

        The specific asset type(s) the user wishes to receive leg options for  # noqa: E501

        :return: The use_asset_types of this PlanningRequest.
        :rtype: List[str]
        """
        return self._use_asset_types

    @use_asset_types.setter
    def use_asset_types(self, use_asset_types: List[str]):
        """Sets the use_asset_types of this PlanningRequest.

        The specific asset type(s) the user wishes to receive leg options for  # noqa: E501

        :param use_asset_types: The use_asset_types of this PlanningRequest.
        :type use_asset_types: List[str]
        """

        self._use_asset_types = use_asset_types
