# 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 Specimen(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',
        'unit_id': 'str',
        'unit_guid': 'str',
        'collectors_field_number': 'str',
        'assemblage_id': 'str',
        'source_institution_id': 'str',
        'source_id': 'str',
        'owner': 'str',
        'license_type': 'str',
        'license': 'str',
        'record_basis': 'str',
        'kind_of_unit': 'str',
        'collection_type': 'str',
        'sex': 'str',
        'phase_or_stage': 'str',
        'title': 'str',
        'notes': 'str',
        'preparation_type': 'str',
        'number_of_specimen': 'int',
        'from_captivity': 'bool',
        'object_public': 'bool',
        'multi_media_public': 'bool',
        'acquired_from': 'Agent',
        'gathering_event': 'GatheringEvent',
        'identifications': 'list[SpecimenIdentification]',
        'associated_multi_media_uris': 'list[ServiceAccessPoint]',
        'theme': 'list[str]',
        'associated_multi_media_objects': 'list[MultiMediaObject]'
    }

    attribute_map = {
        'source_system': 'sourceSystem',
        'source_system_id': 'sourceSystemId',
        'record_uri': 'recordURI',
        'id': 'id',
        'unit_id': 'unitID',
        'unit_guid': 'unitGUID',
        'collectors_field_number': 'collectorsFieldNumber',
        'assemblage_id': 'assemblageID',
        'source_institution_id': 'sourceInstitutionID',
        'source_id': 'sourceID',
        'owner': 'owner',
        'license_type': 'licenseType',
        'license': 'license',
        'record_basis': 'recordBasis',
        'kind_of_unit': 'kindOfUnit',
        'collection_type': 'collectionType',
        'sex': 'sex',
        'phase_or_stage': 'phaseOrStage',
        'title': 'title',
        'notes': 'notes',
        'preparation_type': 'preparationType',
        'number_of_specimen': 'numberOfSpecimen',
        'from_captivity': 'fromCaptivity',
        'object_public': 'objectPublic',
        'multi_media_public': 'multiMediaPublic',
        'acquired_from': 'acquiredFrom',
        'gathering_event': 'gatheringEvent',
        'identifications': 'identifications',
        'associated_multi_media_uris': 'associatedMultiMediaUris',
        'theme': 'theme',
        'associated_multi_media_objects': 'associatedMultiMediaObjects'
    }

    def __init__(self, source_system=None, source_system_id=None, record_uri=None, id=None, unit_id=None, unit_guid=None, collectors_field_number=None, assemblage_id=None, source_institution_id=None, source_id=None, owner=None, license_type=None, license=None, record_basis=None, kind_of_unit=None, collection_type=None, sex=None, phase_or_stage=None, title=None, notes=None, preparation_type=None, number_of_specimen=None, from_captivity=None, object_public=None, multi_media_public=None, acquired_from=None, gathering_event=None, identifications=None, associated_multi_media_uris=None, theme=None, associated_multi_media_objects=None):
        """
        Specimen - a model defined in Swagger
        """

        self._source_system = None
        self._source_system_id = None
        self._record_uri = None
        self._id = None
        self._unit_id = None
        self._unit_guid = None
        self._collectors_field_number = None
        self._assemblage_id = None
        self._source_institution_id = None
        self._source_id = None
        self._owner = None
        self._license_type = None
        self._license = None
        self._record_basis = None
        self._kind_of_unit = None
        self._collection_type = None
        self._sex = None
        self._phase_or_stage = None
        self._title = None
        self._notes = None
        self._preparation_type = None
        self._number_of_specimen = None
        self._from_captivity = None
        self._object_public = None
        self._multi_media_public = None
        self._acquired_from = None
        self._gathering_event = None
        self._identifications = None
        self._associated_multi_media_uris = None
        self._theme = None
        self._associated_multi_media_objects = 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 unit_id is not None:
          self.unit_id = unit_id
        if unit_guid is not None:
          self.unit_guid = unit_guid
        if collectors_field_number is not None:
          self.collectors_field_number = collectors_field_number
        if assemblage_id is not None:
          self.assemblage_id = assemblage_id
        if source_institution_id is not None:
          self.source_institution_id = source_institution_id
        if source_id is not None:
          self.source_id = source_id
        if owner is not None:
          self.owner = owner
        if license_type is not None:
          self.license_type = license_type
        if license is not None:
          self.license = license
        if record_basis is not None:
          self.record_basis = record_basis
        if kind_of_unit is not None:
          self.kind_of_unit = kind_of_unit
        if collection_type is not None:
          self.collection_type = collection_type
        if sex is not None:
          self.sex = sex
        if phase_or_stage is not None:
          self.phase_or_stage = phase_or_stage
        if title is not None:
          self.title = title
        if notes is not None:
          self.notes = notes
        if preparation_type is not None:
          self.preparation_type = preparation_type
        if number_of_specimen is not None:
          self.number_of_specimen = number_of_specimen
        if from_captivity is not None:
          self.from_captivity = from_captivity
        if object_public is not None:
          self.object_public = object_public
        if multi_media_public is not None:
          self.multi_media_public = multi_media_public
        if acquired_from is not None:
          self.acquired_from = acquired_from
        if gathering_event is not None:
          self.gathering_event = gathering_event
        if identifications is not None:
          self.identifications = identifications
        if associated_multi_media_uris is not None:
          self.associated_multi_media_uris = associated_multi_media_uris
        if theme is not None:
          self.theme = theme
        if associated_multi_media_objects is not None:
          self.associated_multi_media_objects = associated_multi_media_objects

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

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

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

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

        self._source_system = source_system

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

        :return: The source_system_id of this Specimen.
        :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 Specimen.

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

        self._source_system_id = source_system_id

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

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

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

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

        self._record_uri = record_uri

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

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

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

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

        self._id = id

    @property
    def unit_id(self):
        """
        Gets the unit_id of this Specimen.

        :return: The unit_id of this Specimen.
        :rtype: str
        """
        return self._unit_id

    @unit_id.setter
    def unit_id(self, unit_id):
        """
        Sets the unit_id of this Specimen.

        :param unit_id: The unit_id of this Specimen.
        :type: str
        """

        self._unit_id = unit_id

    @property
    def unit_guid(self):
        """
        Gets the unit_guid of this Specimen.

        :return: The unit_guid of this Specimen.
        :rtype: str
        """
        return self._unit_guid

    @unit_guid.setter
    def unit_guid(self, unit_guid):
        """
        Sets the unit_guid of this Specimen.

        :param unit_guid: The unit_guid of this Specimen.
        :type: str
        """

        self._unit_guid = unit_guid

    @property
    def collectors_field_number(self):
        """
        Gets the collectors_field_number of this Specimen.

        :return: The collectors_field_number of this Specimen.
        :rtype: str
        """
        return self._collectors_field_number

    @collectors_field_number.setter
    def collectors_field_number(self, collectors_field_number):
        """
        Sets the collectors_field_number of this Specimen.

        :param collectors_field_number: The collectors_field_number of this Specimen.
        :type: str
        """

        self._collectors_field_number = collectors_field_number

    @property
    def assemblage_id(self):
        """
        Gets the assemblage_id of this Specimen.

        :return: The assemblage_id of this Specimen.
        :rtype: str
        """
        return self._assemblage_id

    @assemblage_id.setter
    def assemblage_id(self, assemblage_id):
        """
        Sets the assemblage_id of this Specimen.

        :param assemblage_id: The assemblage_id of this Specimen.
        :type: str
        """

        self._assemblage_id = assemblage_id

    @property
    def source_institution_id(self):
        """
        Gets the source_institution_id of this Specimen.

        :return: The source_institution_id of this Specimen.
        :rtype: str
        """
        return self._source_institution_id

    @source_institution_id.setter
    def source_institution_id(self, source_institution_id):
        """
        Sets the source_institution_id of this Specimen.

        :param source_institution_id: The source_institution_id of this Specimen.
        :type: str
        """

        self._source_institution_id = source_institution_id

    @property
    def source_id(self):
        """
        Gets the source_id of this Specimen.

        :return: The source_id of this Specimen.
        :rtype: str
        """
        return self._source_id

    @source_id.setter
    def source_id(self, source_id):
        """
        Sets the source_id of this Specimen.

        :param source_id: The source_id of this Specimen.
        :type: str
        """

        self._source_id = source_id

    @property
    def owner(self):
        """
        Gets the owner of this Specimen.

        :return: The owner of this Specimen.
        :rtype: str
        """
        return self._owner

    @owner.setter
    def owner(self, owner):
        """
        Sets the owner of this Specimen.

        :param owner: The owner of this Specimen.
        :type: str
        """

        self._owner = owner

    @property
    def license_type(self):
        """
        Gets the license_type of this Specimen.

        :return: The license_type of this Specimen.
        :rtype: str
        """
        return self._license_type

    @license_type.setter
    def license_type(self, license_type):
        """
        Sets the license_type of this Specimen.

        :param license_type: The license_type of this Specimen.
        :type: str
        """

        self._license_type = license_type

    @property
    def license(self):
        """
        Gets the license of this Specimen.

        :return: The license of this Specimen.
        :rtype: str
        """
        return self._license

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

        :param license: The license of this Specimen.
        :type: str
        """

        self._license = license

    @property
    def record_basis(self):
        """
        Gets the record_basis of this Specimen.

        :return: The record_basis of this Specimen.
        :rtype: str
        """
        return self._record_basis

    @record_basis.setter
    def record_basis(self, record_basis):
        """
        Sets the record_basis of this Specimen.

        :param record_basis: The record_basis of this Specimen.
        :type: str
        """

        self._record_basis = record_basis

    @property
    def kind_of_unit(self):
        """
        Gets the kind_of_unit of this Specimen.

        :return: The kind_of_unit of this Specimen.
        :rtype: str
        """
        return self._kind_of_unit

    @kind_of_unit.setter
    def kind_of_unit(self, kind_of_unit):
        """
        Sets the kind_of_unit of this Specimen.

        :param kind_of_unit: The kind_of_unit of this Specimen.
        :type: str
        """

        self._kind_of_unit = kind_of_unit

    @property
    def collection_type(self):
        """
        Gets the collection_type of this Specimen.

        :return: The collection_type of this Specimen.
        :rtype: str
        """
        return self._collection_type

    @collection_type.setter
    def collection_type(self, collection_type):
        """
        Sets the collection_type of this Specimen.

        :param collection_type: The collection_type of this Specimen.
        :type: str
        """

        self._collection_type = collection_type

    @property
    def sex(self):
        """
        Gets the sex of this Specimen.

        :return: The sex of this Specimen.
        :rtype: str
        """
        return self._sex

    @sex.setter
    def sex(self, sex):
        """
        Sets the sex of this Specimen.

        :param sex: The sex of this Specimen.
        :type: str
        """
        allowed_values = ["MALE", "FEMALE", "MIXED", "HERMAPHRODITE"]
        if sex not in allowed_values:
            raise ValueError(
                "Invalid value for `sex` ({0}), must be one of {1}"
                .format(sex, allowed_values)
            )

        self._sex = sex

    @property
    def phase_or_stage(self):
        """
        Gets the phase_or_stage of this Specimen.

        :return: The phase_or_stage of this Specimen.
        :rtype: str
        """
        return self._phase_or_stage

    @phase_or_stage.setter
    def phase_or_stage(self, phase_or_stage):
        """
        Sets the phase_or_stage of this Specimen.

        :param phase_or_stage: The phase_or_stage of this Specimen.
        :type: str
        """
        allowed_values = ["ADULT", "SUBADULT", "EGG", "EMBRYO", "IMMATURE", "JUVENILE", "LARVA", "PUPA", "NYMPH"]
        if phase_or_stage not in allowed_values:
            raise ValueError(
                "Invalid value for `phase_or_stage` ({0}), must be one of {1}"
                .format(phase_or_stage, allowed_values)
            )

        self._phase_or_stage = phase_or_stage

    @property
    def title(self):
        """
        Gets the title of this Specimen.

        :return: The title of this Specimen.
        :rtype: str
        """
        return self._title

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

        :param title: The title of this Specimen.
        :type: str
        """

        self._title = title

    @property
    def notes(self):
        """
        Gets the notes of this Specimen.

        :return: The notes of this Specimen.
        :rtype: str
        """
        return self._notes

    @notes.setter
    def notes(self, notes):
        """
        Sets the notes of this Specimen.

        :param notes: The notes of this Specimen.
        :type: str
        """

        self._notes = notes

    @property
    def preparation_type(self):
        """
        Gets the preparation_type of this Specimen.

        :return: The preparation_type of this Specimen.
        :rtype: str
        """
        return self._preparation_type

    @preparation_type.setter
    def preparation_type(self, preparation_type):
        """
        Sets the preparation_type of this Specimen.

        :param preparation_type: The preparation_type of this Specimen.
        :type: str
        """

        self._preparation_type = preparation_type

    @property
    def number_of_specimen(self):
        """
        Gets the number_of_specimen of this Specimen.

        :return: The number_of_specimen of this Specimen.
        :rtype: int
        """
        return self._number_of_specimen

    @number_of_specimen.setter
    def number_of_specimen(self, number_of_specimen):
        """
        Sets the number_of_specimen of this Specimen.

        :param number_of_specimen: The number_of_specimen of this Specimen.
        :type: int
        """

        self._number_of_specimen = number_of_specimen

    @property
    def from_captivity(self):
        """
        Gets the from_captivity of this Specimen.

        :return: The from_captivity of this Specimen.
        :rtype: bool
        """
        return self._from_captivity

    @from_captivity.setter
    def from_captivity(self, from_captivity):
        """
        Sets the from_captivity of this Specimen.

        :param from_captivity: The from_captivity of this Specimen.
        :type: bool
        """

        self._from_captivity = from_captivity

    @property
    def object_public(self):
        """
        Gets the object_public of this Specimen.

        :return: The object_public of this Specimen.
        :rtype: bool
        """
        return self._object_public

    @object_public.setter
    def object_public(self, object_public):
        """
        Sets the object_public of this Specimen.

        :param object_public: The object_public of this Specimen.
        :type: bool
        """

        self._object_public = object_public

    @property
    def multi_media_public(self):
        """
        Gets the multi_media_public of this Specimen.

        :return: The multi_media_public of this Specimen.
        :rtype: bool
        """
        return self._multi_media_public

    @multi_media_public.setter
    def multi_media_public(self, multi_media_public):
        """
        Sets the multi_media_public of this Specimen.

        :param multi_media_public: The multi_media_public of this Specimen.
        :type: bool
        """

        self._multi_media_public = multi_media_public

    @property
    def acquired_from(self):
        """
        Gets the acquired_from of this Specimen.

        :return: The acquired_from of this Specimen.
        :rtype: Agent
        """
        return self._acquired_from

    @acquired_from.setter
    def acquired_from(self, acquired_from):
        """
        Sets the acquired_from of this Specimen.

        :param acquired_from: The acquired_from of this Specimen.
        :type: Agent
        """

        self._acquired_from = acquired_from

    @property
    def gathering_event(self):
        """
        Gets the gathering_event of this Specimen.

        :return: The gathering_event of this Specimen.
        :rtype: GatheringEvent
        """
        return self._gathering_event

    @gathering_event.setter
    def gathering_event(self, gathering_event):
        """
        Sets the gathering_event of this Specimen.

        :param gathering_event: The gathering_event of this Specimen.
        :type: GatheringEvent
        """

        self._gathering_event = gathering_event

    @property
    def identifications(self):
        """
        Gets the identifications of this Specimen.

        :return: The identifications of this Specimen.
        :rtype: list[SpecimenIdentification]
        """
        return self._identifications

    @identifications.setter
    def identifications(self, identifications):
        """
        Sets the identifications of this Specimen.

        :param identifications: The identifications of this Specimen.
        :type: list[SpecimenIdentification]
        """

        self._identifications = identifications

    @property
    def associated_multi_media_uris(self):
        """
        Gets the associated_multi_media_uris of this Specimen.

        :return: The associated_multi_media_uris of this Specimen.
        :rtype: list[ServiceAccessPoint]
        """
        return self._associated_multi_media_uris

    @associated_multi_media_uris.setter
    def associated_multi_media_uris(self, associated_multi_media_uris):
        """
        Sets the associated_multi_media_uris of this Specimen.

        :param associated_multi_media_uris: The associated_multi_media_uris of this Specimen.
        :type: list[ServiceAccessPoint]
        """

        self._associated_multi_media_uris = associated_multi_media_uris

    @property
    def theme(self):
        """
        Gets the theme of this Specimen.

        :return: The theme of this Specimen.
        :rtype: list[str]
        """
        return self._theme

    @theme.setter
    def theme(self, theme):
        """
        Sets the theme of this Specimen.

        :param theme: The theme of this Specimen.
        :type: list[str]
        """

        self._theme = theme

    @property
    def associated_multi_media_objects(self):
        """
        Gets the associated_multi_media_objects of this Specimen.

        :return: The associated_multi_media_objects of this Specimen.
        :rtype: list[MultiMediaObject]
        """
        return self._associated_multi_media_objects

    @associated_multi_media_objects.setter
    def associated_multi_media_objects(self, associated_multi_media_objects):
        """
        Sets the associated_multi_media_objects of this Specimen.

        :param associated_multi_media_objects: The associated_multi_media_objects of this Specimen.
        :type: list[MultiMediaObject]
        """

        self._associated_multi_media_objects = associated_multi_media_objects

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

        return self.__dict__ == other.__dict__

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