# coding: utf-8

"""

    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)

    OpenAPI spec version: v2
    
    Generated by: https://github.com/swagger-api/swagger-codegen.git
"""


from pprint import pformat
from six import iteritems
import re


class Taxon(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 = {
        'source_system': 'SourceSystem',
        'source_system_id': 'str',
        'record_uri': 'str',
        'id': 'str',
        'source_system_parent_id': 'str',
        'taxon_rank': 'str',
        'taxon_remarks': 'str',
        'occurrence_status_verbatim': 'str',
        'accepted_name': 'ScientificName',
        'default_classification': 'DefaultClassification',
        'system_classification': 'list[Monomial]',
        'synonyms': 'list[ScientificName]',
        'vernacular_names': 'list[VernacularName]',
        'descriptions': 'list[TaxonDescription]',
        'references': 'list[Reference]',
        'experts': 'list[Expert]',
        'valid_name': 'ScientificName'
    }

    attribute_map = {
        'source_system': 'sourceSystem',
        'source_system_id': 'sourceSystemId',
        'record_uri': 'recordURI',
        'id': 'id',
        'source_system_parent_id': 'sourceSystemParentId',
        'taxon_rank': 'taxonRank',
        'taxon_remarks': 'taxonRemarks',
        'occurrence_status_verbatim': 'occurrenceStatusVerbatim',
        'accepted_name': 'acceptedName',
        'default_classification': 'defaultClassification',
        'system_classification': 'systemClassification',
        'synonyms': 'synonyms',
        'vernacular_names': 'vernacularNames',
        'descriptions': 'descriptions',
        'references': 'references',
        'experts': 'experts',
        'valid_name': 'validName'
    }

    def __init__(self, source_system=None, source_system_id=None, record_uri=None, id=None, source_system_parent_id=None, taxon_rank=None, taxon_remarks=None, occurrence_status_verbatim=None, accepted_name=None, default_classification=None, system_classification=None, synonyms=None, vernacular_names=None, descriptions=None, references=None, experts=None, valid_name=None):
        """
        Taxon - a model defined in Swagger
        """

        self._source_system = None
        self._source_system_id = None
        self._record_uri = None
        self._id = None
        self._source_system_parent_id = None
        self._taxon_rank = None
        self._taxon_remarks = None
        self._occurrence_status_verbatim = None
        self._accepted_name = None
        self._default_classification = None
        self._system_classification = None
        self._synonyms = None
        self._vernacular_names = None
        self._descriptions = None
        self._references = None
        self._experts = None
        self._valid_name = None
        self.discriminator = None

        if source_system is not None:
          self.source_system = source_system
        if source_system_id is not None:
          self.source_system_id = source_system_id
        if record_uri is not None:
          self.record_uri = record_uri
        if id is not None:
          self.id = id
        if source_system_parent_id is not None:
          self.source_system_parent_id = source_system_parent_id
        if taxon_rank is not None:
          self.taxon_rank = taxon_rank
        if taxon_remarks is not None:
          self.taxon_remarks = taxon_remarks
        if occurrence_status_verbatim is not None:
          self.occurrence_status_verbatim = occurrence_status_verbatim
        if accepted_name is not None:
          self.accepted_name = accepted_name
        if default_classification is not None:
          self.default_classification = default_classification
        if system_classification is not None:
          self.system_classification = system_classification
        if synonyms is not None:
          self.synonyms = synonyms
        if vernacular_names is not None:
          self.vernacular_names = vernacular_names
        if descriptions is not None:
          self.descriptions = descriptions
        if references is not None:
          self.references = references
        if experts is not None:
          self.experts = experts
        if valid_name is not None:
          self.valid_name = valid_name

    @property
    def source_system(self):
        """
        Gets the source_system of this Taxon.

        :return: The source_system of this Taxon.
        :rtype: SourceSystem
        """
        return self._source_system

    @source_system.setter
    def source_system(self, source_system):
        """
        Sets the source_system of this Taxon.

        :param source_system: The source_system of this Taxon.
        :type: SourceSystem
        """

        self._source_system = source_system

    @property
    def source_system_id(self):
        """
        Gets the source_system_id of this Taxon.

        :return: The source_system_id of this Taxon.
        :rtype: str
        """
        return self._source_system_id

    @source_system_id.setter
    def source_system_id(self, source_system_id):
        """
        Sets the source_system_id of this Taxon.

        :param source_system_id: The source_system_id of this Taxon.
        :type: str
        """

        self._source_system_id = source_system_id

    @property
    def record_uri(self):
        """
        Gets the record_uri of this Taxon.

        :return: The record_uri of this Taxon.
        :rtype: str
        """
        return self._record_uri

    @record_uri.setter
    def record_uri(self, record_uri):
        """
        Sets the record_uri of this Taxon.

        :param record_uri: The record_uri of this Taxon.
        :type: str
        """

        self._record_uri = record_uri

    @property
    def id(self):
        """
        Gets the id of this Taxon.

        :return: The id of this Taxon.
        :rtype: str
        """
        return self._id

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

        :param id: The id of this Taxon.
        :type: str
        """

        self._id = id

    @property
    def source_system_parent_id(self):
        """
        Gets the source_system_parent_id of this Taxon.

        :return: The source_system_parent_id of this Taxon.
        :rtype: str
        """
        return self._source_system_parent_id

    @source_system_parent_id.setter
    def source_system_parent_id(self, source_system_parent_id):
        """
        Sets the source_system_parent_id of this Taxon.

        :param source_system_parent_id: The source_system_parent_id of this Taxon.
        :type: str
        """

        self._source_system_parent_id = source_system_parent_id

    @property
    def taxon_rank(self):
        """
        Gets the taxon_rank of this Taxon.

        :return: The taxon_rank of this Taxon.
        :rtype: str
        """
        return self._taxon_rank

    @taxon_rank.setter
    def taxon_rank(self, taxon_rank):
        """
        Sets the taxon_rank of this Taxon.

        :param taxon_rank: The taxon_rank of this Taxon.
        :type: str
        """

        self._taxon_rank = taxon_rank

    @property
    def taxon_remarks(self):
        """
        Gets the taxon_remarks of this Taxon.

        :return: The taxon_remarks of this Taxon.
        :rtype: str
        """
        return self._taxon_remarks

    @taxon_remarks.setter
    def taxon_remarks(self, taxon_remarks):
        """
        Sets the taxon_remarks of this Taxon.

        :param taxon_remarks: The taxon_remarks of this Taxon.
        :type: str
        """

        self._taxon_remarks = taxon_remarks

    @property
    def occurrence_status_verbatim(self):
        """
        Gets the occurrence_status_verbatim of this Taxon.

        :return: The occurrence_status_verbatim of this Taxon.
        :rtype: str
        """
        return self._occurrence_status_verbatim

    @occurrence_status_verbatim.setter
    def occurrence_status_verbatim(self, occurrence_status_verbatim):
        """
        Sets the occurrence_status_verbatim of this Taxon.

        :param occurrence_status_verbatim: The occurrence_status_verbatim of this Taxon.
        :type: str
        """

        self._occurrence_status_verbatim = occurrence_status_verbatim

    @property
    def accepted_name(self):
        """
        Gets the accepted_name of this Taxon.

        :return: The accepted_name of this Taxon.
        :rtype: ScientificName
        """
        return self._accepted_name

    @accepted_name.setter
    def accepted_name(self, accepted_name):
        """
        Sets the accepted_name of this Taxon.

        :param accepted_name: The accepted_name of this Taxon.
        :type: ScientificName
        """

        self._accepted_name = accepted_name

    @property
    def default_classification(self):
        """
        Gets the default_classification of this Taxon.

        :return: The default_classification of this Taxon.
        :rtype: DefaultClassification
        """
        return self._default_classification

    @default_classification.setter
    def default_classification(self, default_classification):
        """
        Sets the default_classification of this Taxon.

        :param default_classification: The default_classification of this Taxon.
        :type: DefaultClassification
        """

        self._default_classification = default_classification

    @property
    def system_classification(self):
        """
        Gets the system_classification of this Taxon.

        :return: The system_classification of this Taxon.
        :rtype: list[Monomial]
        """
        return self._system_classification

    @system_classification.setter
    def system_classification(self, system_classification):
        """
        Sets the system_classification of this Taxon.

        :param system_classification: The system_classification of this Taxon.
        :type: list[Monomial]
        """

        self._system_classification = system_classification

    @property
    def synonyms(self):
        """
        Gets the synonyms of this Taxon.

        :return: The synonyms of this Taxon.
        :rtype: list[ScientificName]
        """
        return self._synonyms

    @synonyms.setter
    def synonyms(self, synonyms):
        """
        Sets the synonyms of this Taxon.

        :param synonyms: The synonyms of this Taxon.
        :type: list[ScientificName]
        """

        self._synonyms = synonyms

    @property
    def vernacular_names(self):
        """
        Gets the vernacular_names of this Taxon.

        :return: The vernacular_names of this Taxon.
        :rtype: list[VernacularName]
        """
        return self._vernacular_names

    @vernacular_names.setter
    def vernacular_names(self, vernacular_names):
        """
        Sets the vernacular_names of this Taxon.

        :param vernacular_names: The vernacular_names of this Taxon.
        :type: list[VernacularName]
        """

        self._vernacular_names = vernacular_names

    @property
    def descriptions(self):
        """
        Gets the descriptions of this Taxon.

        :return: The descriptions of this Taxon.
        :rtype: list[TaxonDescription]
        """
        return self._descriptions

    @descriptions.setter
    def descriptions(self, descriptions):
        """
        Sets the descriptions of this Taxon.

        :param descriptions: The descriptions of this Taxon.
        :type: list[TaxonDescription]
        """

        self._descriptions = descriptions

    @property
    def references(self):
        """
        Gets the references of this Taxon.

        :return: The references of this Taxon.
        :rtype: list[Reference]
        """
        return self._references

    @references.setter
    def references(self, references):
        """
        Sets the references of this Taxon.

        :param references: The references of this Taxon.
        :type: list[Reference]
        """

        self._references = references

    @property
    def experts(self):
        """
        Gets the experts of this Taxon.

        :return: The experts of this Taxon.
        :rtype: list[Expert]
        """
        return self._experts

    @experts.setter
    def experts(self, experts):
        """
        Sets the experts of this Taxon.

        :param experts: The experts of this Taxon.
        :type: list[Expert]
        """

        self._experts = experts

    @property
    def valid_name(self):
        """
        Gets the valid_name of this Taxon.

        :return: The valid_name of this Taxon.
        :rtype: ScientificName
        """
        return self._valid_name

    @valid_name.setter
    def valid_name(self, valid_name):
        """
        Sets the valid_name of this Taxon.

        :param valid_name: The valid_name of this Taxon.
        :type: ScientificName
        """

        self._valid_name = valid_name

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

        for attr, _ in 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

        return result

    def to_str(self):
        """
        Returns the string representation of the model
        """
        return 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, Taxon):
            return False

        return self.__dict__ == other.__dict__

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