# 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 SpecimenIdentification(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 = {
        'taxon_rank': 'str',
        'scientific_name': 'ScientificName',
        'type_status': 'str',
        'date_identified': 'datetime',
        'default_classification': 'DefaultClassification',
        'system_classification': 'list[Monomial]',
        'vernacular_names': 'list[VernacularName]',
        'identification_qualifiers': 'list[str]',
        'identifiers': 'list[Agent]',
        'taxonomic_enrichments': 'list[TaxonomicEnrichment]',
        'preferred': 'bool',
        'verification_status': 'str',
        'rock_type': 'str',
        'associated_fossil_assemblage': 'str',
        'rock_mineral_usage': 'str',
        'associated_mineral_name': 'str',
        'remarks': 'str'
    }

    attribute_map = {
        'taxon_rank': 'taxonRank',
        'scientific_name': 'scientificName',
        'type_status': 'typeStatus',
        'date_identified': 'dateIdentified',
        'default_classification': 'defaultClassification',
        'system_classification': 'systemClassification',
        'vernacular_names': 'vernacularNames',
        'identification_qualifiers': 'identificationQualifiers',
        'identifiers': 'identifiers',
        'taxonomic_enrichments': 'taxonomicEnrichments',
        'preferred': 'preferred',
        'verification_status': 'verificationStatus',
        'rock_type': 'rockType',
        'associated_fossil_assemblage': 'associatedFossilAssemblage',
        'rock_mineral_usage': 'rockMineralUsage',
        'associated_mineral_name': 'associatedMineralName',
        'remarks': 'remarks'
    }

    def __init__(self, taxon_rank=None, scientific_name=None, type_status=None, date_identified=None, default_classification=None, system_classification=None, vernacular_names=None, identification_qualifiers=None, identifiers=None, taxonomic_enrichments=None, preferred=None, verification_status=None, rock_type=None, associated_fossil_assemblage=None, rock_mineral_usage=None, associated_mineral_name=None, remarks=None):
        """
        SpecimenIdentification - a model defined in Swagger
        """

        self._taxon_rank = None
        self._scientific_name = None
        self._type_status = None
        self._date_identified = None
        self._default_classification = None
        self._system_classification = None
        self._vernacular_names = None
        self._identification_qualifiers = None
        self._identifiers = None
        self._taxonomic_enrichments = None
        self._preferred = None
        self._verification_status = None
        self._rock_type = None
        self._associated_fossil_assemblage = None
        self._rock_mineral_usage = None
        self._associated_mineral_name = None
        self._remarks = None
        self.discriminator = None

        if taxon_rank is not None:
          self.taxon_rank = taxon_rank
        if scientific_name is not None:
          self.scientific_name = scientific_name
        if type_status is not None:
          self.type_status = type_status
        if date_identified is not None:
          self.date_identified = date_identified
        if default_classification is not None:
          self.default_classification = default_classification
        if system_classification is not None:
          self.system_classification = system_classification
        if vernacular_names is not None:
          self.vernacular_names = vernacular_names
        if identification_qualifiers is not None:
          self.identification_qualifiers = identification_qualifiers
        if identifiers is not None:
          self.identifiers = identifiers
        if taxonomic_enrichments is not None:
          self.taxonomic_enrichments = taxonomic_enrichments
        if preferred is not None:
          self.preferred = preferred
        if verification_status is not None:
          self.verification_status = verification_status
        if rock_type is not None:
          self.rock_type = rock_type
        if associated_fossil_assemblage is not None:
          self.associated_fossil_assemblage = associated_fossil_assemblage
        if rock_mineral_usage is not None:
          self.rock_mineral_usage = rock_mineral_usage
        if associated_mineral_name is not None:
          self.associated_mineral_name = associated_mineral_name
        if remarks is not None:
          self.remarks = remarks

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

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

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

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

        self._taxon_rank = taxon_rank

    @property
    def scientific_name(self):
        """
        Gets the scientific_name of this SpecimenIdentification.

        :return: The scientific_name of this SpecimenIdentification.
        :rtype: ScientificName
        """
        return self._scientific_name

    @scientific_name.setter
    def scientific_name(self, scientific_name):
        """
        Sets the scientific_name of this SpecimenIdentification.

        :param scientific_name: The scientific_name of this SpecimenIdentification.
        :type: ScientificName
        """

        self._scientific_name = scientific_name

    @property
    def type_status(self):
        """
        Gets the type_status of this SpecimenIdentification.

        :return: The type_status of this SpecimenIdentification.
        :rtype: str
        """
        return self._type_status

    @type_status.setter
    def type_status(self, type_status):
        """
        Sets the type_status of this SpecimenIdentification.

        :param type_status: The type_status of this SpecimenIdentification.
        :type: str
        """
        allowed_values = ["ALLOTYPE", "EPITYPE", "HAPANTOTYPE", "HOLOTYPE", "ISOEPITYPE", "ISOLECTOTYPE", "ISONEOTYPE", "ISOSYNTYPE", "ISOTYPE", "LECTOTYPE", "NEOTYPE", "PARATYPE", "PARALECTOTYPE", "SYNTYPE", "TOPOTYPE", "TYPE"]
        if type_status not in allowed_values:
            raise ValueError(
                "Invalid value for `type_status` ({0}), must be one of {1}"
                .format(type_status, allowed_values)
            )

        self._type_status = type_status

    @property
    def date_identified(self):
        """
        Gets the date_identified of this SpecimenIdentification.

        :return: The date_identified of this SpecimenIdentification.
        :rtype: datetime
        """
        return self._date_identified

    @date_identified.setter
    def date_identified(self, date_identified):
        """
        Sets the date_identified of this SpecimenIdentification.

        :param date_identified: The date_identified of this SpecimenIdentification.
        :type: datetime
        """

        self._date_identified = date_identified

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

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

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

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

        self._default_classification = default_classification

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

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

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

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

        self._system_classification = system_classification

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

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

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

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

        self._vernacular_names = vernacular_names

    @property
    def identification_qualifiers(self):
        """
        Gets the identification_qualifiers of this SpecimenIdentification.

        :return: The identification_qualifiers of this SpecimenIdentification.
        :rtype: list[str]
        """
        return self._identification_qualifiers

    @identification_qualifiers.setter
    def identification_qualifiers(self, identification_qualifiers):
        """
        Sets the identification_qualifiers of this SpecimenIdentification.

        :param identification_qualifiers: The identification_qualifiers of this SpecimenIdentification.
        :type: list[str]
        """

        self._identification_qualifiers = identification_qualifiers

    @property
    def identifiers(self):
        """
        Gets the identifiers of this SpecimenIdentification.

        :return: The identifiers of this SpecimenIdentification.
        :rtype: list[Agent]
        """
        return self._identifiers

    @identifiers.setter
    def identifiers(self, identifiers):
        """
        Sets the identifiers of this SpecimenIdentification.

        :param identifiers: The identifiers of this SpecimenIdentification.
        :type: list[Agent]
        """

        self._identifiers = identifiers

    @property
    def taxonomic_enrichments(self):
        """
        Gets the taxonomic_enrichments of this SpecimenIdentification.

        :return: The taxonomic_enrichments of this SpecimenIdentification.
        :rtype: list[TaxonomicEnrichment]
        """
        return self._taxonomic_enrichments

    @taxonomic_enrichments.setter
    def taxonomic_enrichments(self, taxonomic_enrichments):
        """
        Sets the taxonomic_enrichments of this SpecimenIdentification.

        :param taxonomic_enrichments: The taxonomic_enrichments of this SpecimenIdentification.
        :type: list[TaxonomicEnrichment]
        """

        self._taxonomic_enrichments = taxonomic_enrichments

    @property
    def preferred(self):
        """
        Gets the preferred of this SpecimenIdentification.

        :return: The preferred of this SpecimenIdentification.
        :rtype: bool
        """
        return self._preferred

    @preferred.setter
    def preferred(self, preferred):
        """
        Sets the preferred of this SpecimenIdentification.

        :param preferred: The preferred of this SpecimenIdentification.
        :type: bool
        """

        self._preferred = preferred

    @property
    def verification_status(self):
        """
        Gets the verification_status of this SpecimenIdentification.

        :return: The verification_status of this SpecimenIdentification.
        :rtype: str
        """
        return self._verification_status

    @verification_status.setter
    def verification_status(self, verification_status):
        """
        Sets the verification_status of this SpecimenIdentification.

        :param verification_status: The verification_status of this SpecimenIdentification.
        :type: str
        """

        self._verification_status = verification_status

    @property
    def rock_type(self):
        """
        Gets the rock_type of this SpecimenIdentification.

        :return: The rock_type of this SpecimenIdentification.
        :rtype: str
        """
        return self._rock_type

    @rock_type.setter
    def rock_type(self, rock_type):
        """
        Sets the rock_type of this SpecimenIdentification.

        :param rock_type: The rock_type of this SpecimenIdentification.
        :type: str
        """

        self._rock_type = rock_type

    @property
    def associated_fossil_assemblage(self):
        """
        Gets the associated_fossil_assemblage of this SpecimenIdentification.

        :return: The associated_fossil_assemblage of this SpecimenIdentification.
        :rtype: str
        """
        return self._associated_fossil_assemblage

    @associated_fossil_assemblage.setter
    def associated_fossil_assemblage(self, associated_fossil_assemblage):
        """
        Sets the associated_fossil_assemblage of this SpecimenIdentification.

        :param associated_fossil_assemblage: The associated_fossil_assemblage of this SpecimenIdentification.
        :type: str
        """

        self._associated_fossil_assemblage = associated_fossil_assemblage

    @property
    def rock_mineral_usage(self):
        """
        Gets the rock_mineral_usage of this SpecimenIdentification.

        :return: The rock_mineral_usage of this SpecimenIdentification.
        :rtype: str
        """
        return self._rock_mineral_usage

    @rock_mineral_usage.setter
    def rock_mineral_usage(self, rock_mineral_usage):
        """
        Sets the rock_mineral_usage of this SpecimenIdentification.

        :param rock_mineral_usage: The rock_mineral_usage of this SpecimenIdentification.
        :type: str
        """

        self._rock_mineral_usage = rock_mineral_usage

    @property
    def associated_mineral_name(self):
        """
        Gets the associated_mineral_name of this SpecimenIdentification.

        :return: The associated_mineral_name of this SpecimenIdentification.
        :rtype: str
        """
        return self._associated_mineral_name

    @associated_mineral_name.setter
    def associated_mineral_name(self, associated_mineral_name):
        """
        Sets the associated_mineral_name of this SpecimenIdentification.

        :param associated_mineral_name: The associated_mineral_name of this SpecimenIdentification.
        :type: str
        """

        self._associated_mineral_name = associated_mineral_name

    @property
    def remarks(self):
        """
        Gets the remarks of this SpecimenIdentification.

        :return: The remarks of this SpecimenIdentification.
        :rtype: str
        """
        return self._remarks

    @remarks.setter
    def remarks(self, remarks):
        """
        Sets the remarks of this SpecimenIdentification.

        :param remarks: The remarks of this SpecimenIdentification.
        :type: str
        """

        self._remarks = remarks

    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, SpecimenIdentification):
            return False

        return self.__dict__ == other.__dict__

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