# coding: utf-8

"""
    apply-api

    The Apply API allows for seamless integration of the Phenom systems, enabling partners to push applications directly. This API also enables partners to integrate the Phenom Quick application process into their own job boards, while still maintaining control over the candidate experience. As a result, candidates can submit their applications without needing to visit the customer career site.  # noqa: E501

    OpenAPI spec version: 2.0.0
    
    Generated by: phenom
"""

import pprint
import re  # noqa: F401

import six

class CandidateWithId(object):
    """
    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 = {
        'first_name': 'str',
        'middle_name': 'str',
        'last_name': 'str',
        'contact_data': 'ContactData',
        'address_data': 'AddressData',
        'sms_opt_in': 'bool',
        'experience_data': 'list[ExperienceData]',
        'education_data': 'list[EducationData]',
        'id': 'str'
    }

    attribute_map = {
        'first_name': 'firstName',
        'middle_name': 'middleName',
        'last_name': 'lastName',
        'contact_data': 'contactData',
        'address_data': 'addressData',
        'sms_opt_in': 'smsOptIn',
        'experience_data': 'experienceData',
        'education_data': 'educationData',
        'id': 'id'
    }

    def __init__(self, first_name=None, middle_name=None, last_name=None, contact_data=None, address_data=None, sms_opt_in=None, experience_data=None, education_data=None, id=None):  # noqa: E501
        """CandidateWithId - a model defined in Swagger"""  # noqa: E501
        self._first_name = None
        self._middle_name = None
        self._last_name = None
        self._contact_data = None
        self._address_data = None
        self._sms_opt_in = None
        self._experience_data = None
        self._education_data = None
        self._id = None
        self.discriminator = None
        self.first_name = first_name
        if middle_name is not None:
            self.middle_name = middle_name
        self.last_name = last_name
        if contact_data is not None:
            self.contact_data = contact_data
        if address_data is not None:
            self.address_data = address_data
        if sms_opt_in is not None:
            self.sms_opt_in = sms_opt_in
        if experience_data is not None:
            self.experience_data = experience_data
        if education_data is not None:
            self.education_data = education_data
        if id is not None:
            self.id = id

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

        First Name of the candidate.  # noqa: E501

        :return: The first_name of this CandidateWithId.  # noqa: E501
        :rtype: str
        """
        return self._first_name

    @first_name.setter
    def first_name(self, first_name):
        """Sets the first_name of this CandidateWithId.

        First Name of the candidate.  # noqa: E501

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

        self._first_name = first_name

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

        Middle Name of the candidate.  # noqa: E501

        :return: The middle_name of this CandidateWithId.  # noqa: E501
        :rtype: str
        """
        return self._middle_name

    @middle_name.setter
    def middle_name(self, middle_name):
        """Sets the middle_name of this CandidateWithId.

        Middle Name of the candidate.  # noqa: E501

        :param middle_name: The middle_name of this CandidateWithId.  # noqa: E501
        :type: str
        """

        self._middle_name = middle_name

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

        Last Name/ Surname of the candidate.  # noqa: E501

        :return: The last_name of this CandidateWithId.  # noqa: E501
        :rtype: str
        """
        return self._last_name

    @last_name.setter
    def last_name(self, last_name):
        """Sets the last_name of this CandidateWithId.

        Last Name/ Surname of the candidate.  # noqa: E501

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

        self._last_name = last_name

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


        :return: The contact_data of this CandidateWithId.  # noqa: E501
        :rtype: ContactData
        """
        return self._contact_data

    @contact_data.setter
    def contact_data(self, contact_data):
        """Sets the contact_data of this CandidateWithId.


        :param contact_data: The contact_data of this CandidateWithId.  # noqa: E501
        :type: ContactData
        """

        self._contact_data = contact_data

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


        :return: The address_data of this CandidateWithId.  # noqa: E501
        :rtype: AddressData
        """
        return self._address_data

    @address_data.setter
    def address_data(self, address_data):
        """Sets the address_data of this CandidateWithId.


        :param address_data: The address_data of this CandidateWithId.  # noqa: E501
        :type: AddressData
        """

        self._address_data = address_data

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

        Opt in for SMS Campaigns.  # noqa: E501

        :return: The sms_opt_in of this CandidateWithId.  # noqa: E501
        :rtype: bool
        """
        return self._sms_opt_in

    @sms_opt_in.setter
    def sms_opt_in(self, sms_opt_in):
        """Sets the sms_opt_in of this CandidateWithId.

        Opt in for SMS Campaigns.  # noqa: E501

        :param sms_opt_in: The sms_opt_in of this CandidateWithId.  # noqa: E501
        :type: bool
        """

        self._sms_opt_in = sms_opt_in

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


        :return: The experience_data of this CandidateWithId.  # noqa: E501
        :rtype: list[ExperienceData]
        """
        return self._experience_data

    @experience_data.setter
    def experience_data(self, experience_data):
        """Sets the experience_data of this CandidateWithId.


        :param experience_data: The experience_data of this CandidateWithId.  # noqa: E501
        :type: list[ExperienceData]
        """

        self._experience_data = experience_data

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


        :return: The education_data of this CandidateWithId.  # noqa: E501
        :rtype: list[EducationData]
        """
        return self._education_data

    @education_data.setter
    def education_data(self, education_data):
        """Sets the education_data of this CandidateWithId.


        :param education_data: The education_data of this CandidateWithId.  # noqa: E501
        :type: list[EducationData]
        """

        self._education_data = education_data

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

        It is a 24-digit hexadecimal value that represents Applicant Id.  # noqa: E501

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

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

        It is a 24-digit hexadecimal value that represents Applicant Id.  # noqa: E501

        :param id: The id of this CandidateWithId.  # noqa: E501
        :type: str
        """

        self._id = id

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

        return self.__dict__ == other.__dict__

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