# coding: utf-8

"""
    ARLAS Exploration API

    Explore the content of ARLAS collections  # noqa: E501

    OpenAPI spec version: 19.0.1
    Contact: contact@gisaia.com
    Generated by: https://github.com/swagger-api/swagger-codegen.git
"""


import pprint
import re  # noqa: F401

import six


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

    Do not edit the class manually.
    """

    """
    Attributes:
      swagger_types (dict): The key is attribute name
                            and the value is attribute type.
      attribute_map (dict): The key is attribute name
                            and the value is json key in definition.
    """
    swagger_types = {
        'stac_version': 'str',
        'stac_extensions': 'list[str]',
        'type': 'str',
        'id': 'str',
        'title': 'str',
        'description': 'str',
        'links': 'list[StacLink]',
        'keywords': 'list[str]',
        'crs': 'list[str]',
        'license': 'str',
        'extent': 'Extent',
        'providers': 'list[Provider]',
        'summaries': 'dict(str, object)',
        'assets': 'dict(str, object)'
    }

    attribute_map = {
        'stac_version': 'stac_version',
        'stac_extensions': 'stac_extensions',
        'type': 'type',
        'id': 'id',
        'title': 'title',
        'description': 'description',
        'links': 'links',
        'keywords': 'keywords',
        'crs': 'crs',
        'license': 'license',
        'extent': 'extent',
        'providers': 'providers',
        'summaries': 'summaries',
        'assets': 'assets'
    }

    def __init__(self, stac_version=None, stac_extensions=None, type=None, id=None, title=None, description=None, links=None, keywords=None, crs=None, license=None, extent=None, providers=None, summaries=None, assets=None):  # noqa: E501
        """Collection - a model defined in Swagger"""  # noqa: E501

        self._stac_version = None
        self._stac_extensions = None
        self._type = None
        self._id = None
        self._title = None
        self._description = None
        self._links = None
        self._keywords = None
        self._crs = None
        self._license = None
        self._extent = None
        self._providers = None
        self._summaries = None
        self._assets = None
        self.discriminator = None

        self.stac_version = stac_version
        if stac_extensions is not None:
            self.stac_extensions = stac_extensions
        self.type = type
        self.id = id
        if title is not None:
            self.title = title
        self.description = description
        self.links = links
        if keywords is not None:
            self.keywords = keywords
        if crs is not None:
            self.crs = crs
        self.license = license
        self.extent = extent
        if providers is not None:
            self.providers = providers
        if summaries is not None:
            self.summaries = summaries
        if assets is not None:
            self.assets = assets

    @property
    def stac_version(self):
        """Gets the stac_version of this Collection.  # noqa: E501


        :return: The stac_version of this Collection.  # noqa: E501
        :rtype: str
        """
        return self._stac_version

    @stac_version.setter
    def stac_version(self, stac_version):
        """Sets the stac_version of this Collection.


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

        self._stac_version = stac_version

    @property
    def stac_extensions(self):
        """Gets the stac_extensions of this Collection.  # noqa: E501


        :return: The stac_extensions of this Collection.  # noqa: E501
        :rtype: list[str]
        """
        return self._stac_extensions

    @stac_extensions.setter
    def stac_extensions(self, stac_extensions):
        """Sets the stac_extensions of this Collection.


        :param stac_extensions: The stac_extensions of this Collection.  # noqa: E501
        :type: list[str]
        """

        self._stac_extensions = stac_extensions

    @property
    def type(self):
        """Gets the type of this Collection.  # noqa: E501


        :return: The type of this Collection.  # noqa: E501
        :rtype: str
        """
        return self._type

    @type.setter
    def type(self, type):
        """Sets the type of this Collection.


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

        self._type = type

    @property
    def id(self):
        """Gets the id of this Collection.  # noqa: E501

        identifier of the collection used, for example, in URIs  # noqa: E501

        :return: The id of this Collection.  # noqa: E501
        :rtype: str
        """
        return self._id

    @id.setter
    def id(self, id):
        """Sets the id of this Collection.

        identifier of the collection used, for example, in URIs  # noqa: E501

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

        self._id = id

    @property
    def title(self):
        """Gets the title of this Collection.  # noqa: E501

        human readable title of the collection  # noqa: E501

        :return: The title of this Collection.  # noqa: E501
        :rtype: str
        """
        return self._title

    @title.setter
    def title(self, title):
        """Sets the title of this Collection.

        human readable title of the collection  # noqa: E501

        :param title: The title of this Collection.  # noqa: E501
        :type: str
        """

        self._title = title

    @property
    def description(self):
        """Gets the description of this Collection.  # noqa: E501

        Detailed multi-line description to fully explain the catalog or collection. [CommonMark 0.29](http://commonmark.org/) syntax MAY be used for rich text representation.  # noqa: E501

        :return: The description of this Collection.  # noqa: E501
        :rtype: str
        """
        return self._description

    @description.setter
    def description(self, description):
        """Sets the description of this Collection.

        Detailed multi-line description to fully explain the catalog or collection. [CommonMark 0.29](http://commonmark.org/) syntax MAY be used for rich text representation.  # noqa: E501

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

        self._description = description

    @property
    def links(self):
        """Gets the links of this Collection.  # noqa: E501


        :return: The links of this Collection.  # noqa: E501
        :rtype: list[StacLink]
        """
        return self._links

    @links.setter
    def links(self, links):
        """Sets the links of this Collection.


        :param links: The links of this Collection.  # noqa: E501
        :type: list[StacLink]
        """
        if links is None:
            raise ValueError("Invalid value for `links`, must not be `None`")  # noqa: E501

        self._links = links

    @property
    def keywords(self):
        """Gets the keywords of this Collection.  # noqa: E501

        List of keywords describing the collection.  # noqa: E501

        :return: The keywords of this Collection.  # noqa: E501
        :rtype: list[str]
        """
        return self._keywords

    @keywords.setter
    def keywords(self, keywords):
        """Sets the keywords of this Collection.

        List of keywords describing the collection.  # noqa: E501

        :param keywords: The keywords of this Collection.  # noqa: E501
        :type: list[str]
        """

        self._keywords = keywords

    @property
    def crs(self):
        """Gets the crs of this Collection.  # noqa: E501

        List of crs describing the collection.  # noqa: E501

        :return: The crs of this Collection.  # noqa: E501
        :rtype: list[str]
        """
        return self._crs

    @crs.setter
    def crs(self, crs):
        """Sets the crs of this Collection.

        List of crs describing the collection.  # noqa: E501

        :param crs: The crs of this Collection.  # noqa: E501
        :type: list[str]
        """

        self._crs = crs

    @property
    def license(self):
        """Gets the license of this Collection.  # noqa: E501


        :return: The license of this Collection.  # noqa: E501
        :rtype: str
        """
        return self._license

    @license.setter
    def license(self, license):
        """Sets the license of this Collection.


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

        self._license = license

    @property
    def extent(self):
        """Gets the extent of this Collection.  # noqa: E501


        :return: The extent of this Collection.  # noqa: E501
        :rtype: Extent
        """
        return self._extent

    @extent.setter
    def extent(self, extent):
        """Sets the extent of this Collection.


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

        self._extent = extent

    @property
    def providers(self):
        """Gets the providers of this Collection.  # noqa: E501


        :return: The providers of this Collection.  # noqa: E501
        :rtype: list[Provider]
        """
        return self._providers

    @providers.setter
    def providers(self, providers):
        """Sets the providers of this Collection.


        :param providers: The providers of this Collection.  # noqa: E501
        :type: list[Provider]
        """

        self._providers = providers

    @property
    def summaries(self):
        """Gets the summaries of this Collection.  # noqa: E501

        Summaries are either a unique set of all available values *or* statistics. Statistics by default only specify the range (minimum and maximum values), but can optionally be accompanied by additional statistical values. The range can specify the potential range of values, but it is recommended to be as precise as possible. The set of values must contain at least one element and it is strongly recommended to list all values. It is recommended to list as many properties as reasonable so that consumers get a full overview of the Collection. Properties that are covered by the Collection specification (e.g. `providers` and `license`) may not be repeated in the summaries.  # noqa: E501

        :return: The summaries of this Collection.  # noqa: E501
        :rtype: dict(str, object)
        """
        return self._summaries

    @summaries.setter
    def summaries(self, summaries):
        """Sets the summaries of this Collection.

        Summaries are either a unique set of all available values *or* statistics. Statistics by default only specify the range (minimum and maximum values), but can optionally be accompanied by additional statistical values. The range can specify the potential range of values, but it is recommended to be as precise as possible. The set of values must contain at least one element and it is strongly recommended to list all values. It is recommended to list as many properties as reasonable so that consumers get a full overview of the Collection. Properties that are covered by the Collection specification (e.g. `providers` and `license`) may not be repeated in the summaries.  # noqa: E501

        :param summaries: The summaries of this Collection.  # noqa: E501
        :type: dict(str, object)
        """

        self._summaries = summaries

    @property
    def assets(self):
        """Gets the assets of this Collection.  # noqa: E501

        This provides an optional mechanism to expose assets that don't make sense at the Item level.  # noqa: E501

        :return: The assets of this Collection.  # noqa: E501
        :rtype: dict(str, object)
        """
        return self._assets

    @assets.setter
    def assets(self, assets):
        """Sets the assets of this Collection.

        This provides an optional mechanism to expose assets that don't make sense at the Item level.  # noqa: E501

        :param assets: The assets of this Collection.  # noqa: E501
        :type: dict(str, object)
        """

        self._assets = assets

    def to_dict(self):
        """Returns the model properties as a dict"""
        result = {}

        for attr, _ in six.iteritems(self.swagger_types):
            value = getattr(self, attr)
            if isinstance(value, list):
                result[attr] = list(map(
                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
                    value
                ))
            elif hasattr(value, "to_dict"):
                result[attr] = value.to_dict()
            elif isinstance(value, dict):
                result[attr] = dict(map(
                    lambda item: (item[0], item[1].to_dict())
                    if hasattr(item[1], "to_dict") else item,
                    value.items()
                ))
            else:
                result[attr] = value
        if issubclass(Collection, dict):
            for key, value in self.items():
                result[key] = value

        return result

    def to_str(self):
        """Returns the string representation of the model"""
        return pprint.pformat(self.to_dict())

    def __repr__(self):
        """For `print` and `pprint`"""
        return self.to_str()

    def __eq__(self, other):
        """Returns true if both objects are equal"""
        if not isinstance(other, Collection):
            return False

        return self.__dict__ == other.__dict__

    def __ne__(self, other):
        """Returns true if both objects are not equal"""
        return not self == other
