# 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 ScientificName(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 = {
        'full_scientific_name': 'str',
        'taxonomic_status': 'str',
        'genus_or_monomial': 'str',
        'subgenus': 'str',
        'specific_epithet': 'str',
        'infraspecific_epithet': 'str',
        'infraspecific_marker': 'str',
        'name_addendum': 'str',
        'authorship_verbatim': 'str',
        'author': 'str',
        'year': 'str',
        'scientific_name_group': 'str',
        'references': 'list[Reference]',
        'experts': 'list[Expert]'
    }

    attribute_map = {
        'full_scientific_name': 'fullScientificName',
        'taxonomic_status': 'taxonomicStatus',
        'genus_or_monomial': 'genusOrMonomial',
        'subgenus': 'subgenus',
        'specific_epithet': 'specificEpithet',
        'infraspecific_epithet': 'infraspecificEpithet',
        'infraspecific_marker': 'infraspecificMarker',
        'name_addendum': 'nameAddendum',
        'authorship_verbatim': 'authorshipVerbatim',
        'author': 'author',
        'year': 'year',
        'scientific_name_group': 'scientificNameGroup',
        'references': 'references',
        'experts': 'experts'
    }

    def __init__(self, full_scientific_name=None, taxonomic_status=None, genus_or_monomial=None, subgenus=None, specific_epithet=None, infraspecific_epithet=None, infraspecific_marker=None, name_addendum=None, authorship_verbatim=None, author=None, year=None, scientific_name_group=None, references=None, experts=None):
        """
        ScientificName - a model defined in Swagger
        """

        self._full_scientific_name = None
        self._taxonomic_status = None
        self._genus_or_monomial = None
        self._subgenus = None
        self._specific_epithet = None
        self._infraspecific_epithet = None
        self._infraspecific_marker = None
        self._name_addendum = None
        self._authorship_verbatim = None
        self._author = None
        self._year = None
        self._scientific_name_group = None
        self._references = None
        self._experts = None
        self.discriminator = None

        if full_scientific_name is not None:
          self.full_scientific_name = full_scientific_name
        if taxonomic_status is not None:
          self.taxonomic_status = taxonomic_status
        if genus_or_monomial is not None:
          self.genus_or_monomial = genus_or_monomial
        if subgenus is not None:
          self.subgenus = subgenus
        if specific_epithet is not None:
          self.specific_epithet = specific_epithet
        if infraspecific_epithet is not None:
          self.infraspecific_epithet = infraspecific_epithet
        if infraspecific_marker is not None:
          self.infraspecific_marker = infraspecific_marker
        if name_addendum is not None:
          self.name_addendum = name_addendum
        if authorship_verbatim is not None:
          self.authorship_verbatim = authorship_verbatim
        if author is not None:
          self.author = author
        if year is not None:
          self.year = year
        if scientific_name_group is not None:
          self.scientific_name_group = scientific_name_group
        if references is not None:
          self.references = references
        if experts is not None:
          self.experts = experts

    @property
    def full_scientific_name(self):
        """
        Gets the full_scientific_name of this ScientificName.

        :return: The full_scientific_name of this ScientificName.
        :rtype: str
        """
        return self._full_scientific_name

    @full_scientific_name.setter
    def full_scientific_name(self, full_scientific_name):
        """
        Sets the full_scientific_name of this ScientificName.

        :param full_scientific_name: The full_scientific_name of this ScientificName.
        :type: str
        """

        self._full_scientific_name = full_scientific_name

    @property
    def taxonomic_status(self):
        """
        Gets the taxonomic_status of this ScientificName.

        :return: The taxonomic_status of this ScientificName.
        :rtype: str
        """
        return self._taxonomic_status

    @taxonomic_status.setter
    def taxonomic_status(self, taxonomic_status):
        """
        Sets the taxonomic_status of this ScientificName.

        :param taxonomic_status: The taxonomic_status of this ScientificName.
        :type: str
        """
        allowed_values = ["accepted name", "synonym", "basionym", "homonym", "ambiguous synonym", "misapplied name", "misspelled name", "provisionally accepted name"]
        if taxonomic_status not in allowed_values:
            raise ValueError(
                "Invalid value for `taxonomic_status` ({0}), must be one of {1}"
                .format(taxonomic_status, allowed_values)
            )

        self._taxonomic_status = taxonomic_status

    @property
    def genus_or_monomial(self):
        """
        Gets the genus_or_monomial of this ScientificName.

        :return: The genus_or_monomial of this ScientificName.
        :rtype: str
        """
        return self._genus_or_monomial

    @genus_or_monomial.setter
    def genus_or_monomial(self, genus_or_monomial):
        """
        Sets the genus_or_monomial of this ScientificName.

        :param genus_or_monomial: The genus_or_monomial of this ScientificName.
        :type: str
        """

        self._genus_or_monomial = genus_or_monomial

    @property
    def subgenus(self):
        """
        Gets the subgenus of this ScientificName.

        :return: The subgenus of this ScientificName.
        :rtype: str
        """
        return self._subgenus

    @subgenus.setter
    def subgenus(self, subgenus):
        """
        Sets the subgenus of this ScientificName.

        :param subgenus: The subgenus of this ScientificName.
        :type: str
        """

        self._subgenus = subgenus

    @property
    def specific_epithet(self):
        """
        Gets the specific_epithet of this ScientificName.

        :return: The specific_epithet of this ScientificName.
        :rtype: str
        """
        return self._specific_epithet

    @specific_epithet.setter
    def specific_epithet(self, specific_epithet):
        """
        Sets the specific_epithet of this ScientificName.

        :param specific_epithet: The specific_epithet of this ScientificName.
        :type: str
        """

        self._specific_epithet = specific_epithet

    @property
    def infraspecific_epithet(self):
        """
        Gets the infraspecific_epithet of this ScientificName.

        :return: The infraspecific_epithet of this ScientificName.
        :rtype: str
        """
        return self._infraspecific_epithet

    @infraspecific_epithet.setter
    def infraspecific_epithet(self, infraspecific_epithet):
        """
        Sets the infraspecific_epithet of this ScientificName.

        :param infraspecific_epithet: The infraspecific_epithet of this ScientificName.
        :type: str
        """

        self._infraspecific_epithet = infraspecific_epithet

    @property
    def infraspecific_marker(self):
        """
        Gets the infraspecific_marker of this ScientificName.

        :return: The infraspecific_marker of this ScientificName.
        :rtype: str
        """
        return self._infraspecific_marker

    @infraspecific_marker.setter
    def infraspecific_marker(self, infraspecific_marker):
        """
        Sets the infraspecific_marker of this ScientificName.

        :param infraspecific_marker: The infraspecific_marker of this ScientificName.
        :type: str
        """

        self._infraspecific_marker = infraspecific_marker

    @property
    def name_addendum(self):
        """
        Gets the name_addendum of this ScientificName.

        :return: The name_addendum of this ScientificName.
        :rtype: str
        """
        return self._name_addendum

    @name_addendum.setter
    def name_addendum(self, name_addendum):
        """
        Sets the name_addendum of this ScientificName.

        :param name_addendum: The name_addendum of this ScientificName.
        :type: str
        """

        self._name_addendum = name_addendum

    @property
    def authorship_verbatim(self):
        """
        Gets the authorship_verbatim of this ScientificName.

        :return: The authorship_verbatim of this ScientificName.
        :rtype: str
        """
        return self._authorship_verbatim

    @authorship_verbatim.setter
    def authorship_verbatim(self, authorship_verbatim):
        """
        Sets the authorship_verbatim of this ScientificName.

        :param authorship_verbatim: The authorship_verbatim of this ScientificName.
        :type: str
        """

        self._authorship_verbatim = authorship_verbatim

    @property
    def author(self):
        """
        Gets the author of this ScientificName.

        :return: The author of this ScientificName.
        :rtype: str
        """
        return self._author

    @author.setter
    def author(self, author):
        """
        Sets the author of this ScientificName.

        :param author: The author of this ScientificName.
        :type: str
        """

        self._author = author

    @property
    def year(self):
        """
        Gets the year of this ScientificName.

        :return: The year of this ScientificName.
        :rtype: str
        """
        return self._year

    @year.setter
    def year(self, year):
        """
        Sets the year of this ScientificName.

        :param year: The year of this ScientificName.
        :type: str
        """

        self._year = year

    @property
    def scientific_name_group(self):
        """
        Gets the scientific_name_group of this ScientificName.

        :return: The scientific_name_group of this ScientificName.
        :rtype: str
        """
        return self._scientific_name_group

    @scientific_name_group.setter
    def scientific_name_group(self, scientific_name_group):
        """
        Sets the scientific_name_group of this ScientificName.

        :param scientific_name_group: The scientific_name_group of this ScientificName.
        :type: str
        """

        self._scientific_name_group = scientific_name_group

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

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

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

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

        self._references = references

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

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

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

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

        self._experts = experts

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

        return self.__dict__ == other.__dict__

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