# coding: utf-8

"""
    MailSlurp API

    MailSlurp is an API for sending and receiving emails and SMS from dynamically allocated email addresses and phone numbers. It's designed for developers and QA teams to test applications, process inbound emails, send templated notifications, attachments, and more.  ## Resources  - [Homepage](https://www.mailslurp.com) - Get an [API KEY](https://app.mailslurp.com/sign-up/) - Generated [SDK Clients](https://docs.mailslurp.com/) - [Examples](https://github.com/mailslurp/examples) repository  # noqa: E501

    The version of the OpenAPI document: 6.5.2
    Contact: contact@mailslurp.dev
    Generated by: https://openapi-generator.tech
"""


import pprint
import re  # noqa: F401

import six

from mailslurp_client.configuration import Configuration


class EmailThreadProjection(object):
    """NOTE: This class is auto generated by OpenAPI Generator.
    Ref: https://openapi-generator.tech

    Do not edit the class manually.
    """

    """
    Attributes:
      openapi_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.
    """
    openapi_types = {
        'id': 'str',
        '_from': 'str',
        'subject': 'str',
        'sender': 'SenderProjection',
        'recipients': 'EmailRecipientsProjection',
        'user_id': 'str',
        'inbox_id': 'str',
        'updated_at': 'datetime',
        'created_at': 'datetime',
        'to': 'list[str]',
        'cc': 'list[str]',
        'bcc': 'list[str]',
        'has_attachments': 'bool',
        'unread': 'bool',
        'message_count': 'int',
        'last_body_excerpt': 'str',
        'last_text_excerpt': 'str',
        'last_created_at': 'datetime',
        'last_from': 'str',
        'last_sender': 'SenderProjection'
    }

    attribute_map = {
        'id': 'id',
        '_from': 'from',
        'subject': 'subject',
        'sender': 'sender',
        'recipients': 'recipients',
        'user_id': 'userId',
        'inbox_id': 'inboxId',
        'updated_at': 'updatedAt',
        'created_at': 'createdAt',
        'to': 'to',
        'cc': 'cc',
        'bcc': 'bcc',
        'has_attachments': 'hasAttachments',
        'unread': 'unread',
        'message_count': 'messageCount',
        'last_body_excerpt': 'lastBodyExcerpt',
        'last_text_excerpt': 'lastTextExcerpt',
        'last_created_at': 'lastCreatedAt',
        'last_from': 'lastFrom',
        'last_sender': 'lastSender'
    }

    def __init__(self, id=None, _from=None, subject=None, sender=None, recipients=None, user_id=None, inbox_id=None, updated_at=None, created_at=None, to=None, cc=None, bcc=None, has_attachments=None, unread=None, message_count=None, last_body_excerpt=None, last_text_excerpt=None, last_created_at=None, last_from=None, last_sender=None, local_vars_configuration=None):  # noqa: E501
        """EmailThreadProjection - a model defined in OpenAPI"""  # noqa: E501
        if local_vars_configuration is None:
            local_vars_configuration = Configuration()
        self.local_vars_configuration = local_vars_configuration

        self._id = None
        self.__from = None
        self._subject = None
        self._sender = None
        self._recipients = None
        self._user_id = None
        self._inbox_id = None
        self._updated_at = None
        self._created_at = None
        self._to = None
        self._cc = None
        self._bcc = None
        self._has_attachments = None
        self._unread = None
        self._message_count = None
        self._last_body_excerpt = None
        self._last_text_excerpt = None
        self._last_created_at = None
        self._last_from = None
        self._last_sender = None
        self.discriminator = None

        self.id = id
        if _from is not None:
            self._from = _from
        if subject is not None:
            self.subject = subject
        if sender is not None:
            self.sender = sender
        if recipients is not None:
            self.recipients = recipients
        self.user_id = user_id
        if inbox_id is not None:
            self.inbox_id = inbox_id
        self.updated_at = updated_at
        self.created_at = created_at
        self.to = to
        if cc is not None:
            self.cc = cc
        if bcc is not None:
            self.bcc = bcc
        self.has_attachments = has_attachments
        self.unread = unread
        self.message_count = message_count
        if last_body_excerpt is not None:
            self.last_body_excerpt = last_body_excerpt
        if last_text_excerpt is not None:
            self.last_text_excerpt = last_text_excerpt
        if last_created_at is not None:
            self.last_created_at = last_created_at
        if last_from is not None:
            self.last_from = last_from
        if last_sender is not None:
            self.last_sender = last_sender

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

        ID of email thread  # noqa: E501

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

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

        ID of email thread  # noqa: E501

        :param id: The id of this EmailThreadProjection.  # noqa: E501
        :type: str
        """
        if self.local_vars_configuration.client_side_validation and id is None:  # noqa: E501
            raise ValueError("Invalid value for `id`, must not be `None`")  # noqa: E501

        self._id = id

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

        From sender  # noqa: E501

        :return: The _from of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self.__from

    @_from.setter
    def _from(self, _from):
        """Sets the _from of this EmailThreadProjection.

        From sender  # noqa: E501

        :param _from: The _from of this EmailThreadProjection.  # noqa: E501
        :type: str
        """

        self.__from = _from

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

        Thread topic subject  # noqa: E501

        :return: The subject of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self._subject

    @subject.setter
    def subject(self, subject):
        """Sets the subject of this EmailThreadProjection.

        Thread topic subject  # noqa: E501

        :param subject: The subject of this EmailThreadProjection.  # noqa: E501
        :type: str
        """

        self._subject = subject

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


        :return: The sender of this EmailThreadProjection.  # noqa: E501
        :rtype: SenderProjection
        """
        return self._sender

    @sender.setter
    def sender(self, sender):
        """Sets the sender of this EmailThreadProjection.


        :param sender: The sender of this EmailThreadProjection.  # noqa: E501
        :type: SenderProjection
        """

        self._sender = sender

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


        :return: The recipients of this EmailThreadProjection.  # noqa: E501
        :rtype: EmailRecipientsProjection
        """
        return self._recipients

    @recipients.setter
    def recipients(self, recipients):
        """Sets the recipients of this EmailThreadProjection.


        :param recipients: The recipients of this EmailThreadProjection.  # noqa: E501
        :type: EmailRecipientsProjection
        """

        self._recipients = recipients

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

        User ID  # noqa: E501

        :return: The user_id of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self._user_id

    @user_id.setter
    def user_id(self, user_id):
        """Sets the user_id of this EmailThreadProjection.

        User ID  # noqa: E501

        :param user_id: The user_id of this EmailThreadProjection.  # noqa: E501
        :type: str
        """
        if self.local_vars_configuration.client_side_validation and user_id is None:  # noqa: E501
            raise ValueError("Invalid value for `user_id`, must not be `None`")  # noqa: E501

        self._user_id = user_id

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

        Inbox ID  # noqa: E501

        :return: The inbox_id of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self._inbox_id

    @inbox_id.setter
    def inbox_id(self, inbox_id):
        """Sets the inbox_id of this EmailThreadProjection.

        Inbox ID  # noqa: E501

        :param inbox_id: The inbox_id of this EmailThreadProjection.  # noqa: E501
        :type: str
        """

        self._inbox_id = inbox_id

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

        Updated at DateTime  # noqa: E501

        :return: The updated_at of this EmailThreadProjection.  # noqa: E501
        :rtype: datetime
        """
        return self._updated_at

    @updated_at.setter
    def updated_at(self, updated_at):
        """Sets the updated_at of this EmailThreadProjection.

        Updated at DateTime  # noqa: E501

        :param updated_at: The updated_at of this EmailThreadProjection.  # noqa: E501
        :type: datetime
        """
        if self.local_vars_configuration.client_side_validation and updated_at is None:  # noqa: E501
            raise ValueError("Invalid value for `updated_at`, must not be `None`")  # noqa: E501

        self._updated_at = updated_at

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

        Created at DateTime  # noqa: E501

        :return: The created_at of this EmailThreadProjection.  # noqa: E501
        :rtype: datetime
        """
        return self._created_at

    @created_at.setter
    def created_at(self, created_at):
        """Sets the created_at of this EmailThreadProjection.

        Created at DateTime  # noqa: E501

        :param created_at: The created_at of this EmailThreadProjection.  # noqa: E501
        :type: datetime
        """
        if self.local_vars_configuration.client_side_validation and created_at is None:  # noqa: E501
            raise ValueError("Invalid value for `created_at`, must not be `None`")  # noqa: E501

        self._created_at = created_at

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

        To recipients  # noqa: E501

        :return: The to of this EmailThreadProjection.  # noqa: E501
        :rtype: list[str]
        """
        return self._to

    @to.setter
    def to(self, to):
        """Sets the to of this EmailThreadProjection.

        To recipients  # noqa: E501

        :param to: The to of this EmailThreadProjection.  # noqa: E501
        :type: list[str]
        """
        if self.local_vars_configuration.client_side_validation and to is None:  # noqa: E501
            raise ValueError("Invalid value for `to`, must not be `None`")  # noqa: E501

        self._to = to

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

        CC recipients  # noqa: E501

        :return: The cc of this EmailThreadProjection.  # noqa: E501
        :rtype: list[str]
        """
        return self._cc

    @cc.setter
    def cc(self, cc):
        """Sets the cc of this EmailThreadProjection.

        CC recipients  # noqa: E501

        :param cc: The cc of this EmailThreadProjection.  # noqa: E501
        :type: list[str]
        """

        self._cc = cc

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

        BCC recipients  # noqa: E501

        :return: The bcc of this EmailThreadProjection.  # noqa: E501
        :rtype: list[str]
        """
        return self._bcc

    @bcc.setter
    def bcc(self, bcc):
        """Sets the bcc of this EmailThreadProjection.

        BCC recipients  # noqa: E501

        :param bcc: The bcc of this EmailThreadProjection.  # noqa: E501
        :type: list[str]
        """

        self._bcc = bcc

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

        Has attachments  # noqa: E501

        :return: The has_attachments of this EmailThreadProjection.  # noqa: E501
        :rtype: bool
        """
        return self._has_attachments

    @has_attachments.setter
    def has_attachments(self, has_attachments):
        """Sets the has_attachments of this EmailThreadProjection.

        Has attachments  # noqa: E501

        :param has_attachments: The has_attachments of this EmailThreadProjection.  # noqa: E501
        :type: bool
        """
        if self.local_vars_configuration.client_side_validation and has_attachments is None:  # noqa: E501
            raise ValueError("Invalid value for `has_attachments`, must not be `None`")  # noqa: E501

        self._has_attachments = has_attachments

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

        Has unread  # noqa: E501

        :return: The unread of this EmailThreadProjection.  # noqa: E501
        :rtype: bool
        """
        return self._unread

    @unread.setter
    def unread(self, unread):
        """Sets the unread of this EmailThreadProjection.

        Has unread  # noqa: E501

        :param unread: The unread of this EmailThreadProjection.  # noqa: E501
        :type: bool
        """
        if self.local_vars_configuration.client_side_validation and unread is None:  # noqa: E501
            raise ValueError("Invalid value for `unread`, must not be `None`")  # noqa: E501

        self._unread = unread

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

        Number of messages in the thread  # noqa: E501

        :return: The message_count of this EmailThreadProjection.  # noqa: E501
        :rtype: int
        """
        return self._message_count

    @message_count.setter
    def message_count(self, message_count):
        """Sets the message_count of this EmailThreadProjection.

        Number of messages in the thread  # noqa: E501

        :param message_count: The message_count of this EmailThreadProjection.  # noqa: E501
        :type: int
        """
        if self.local_vars_configuration.client_side_validation and message_count is None:  # noqa: E501
            raise ValueError("Invalid value for `message_count`, must not be `None`")  # noqa: E501

        self._message_count = message_count

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

        Last body excerpt  # noqa: E501

        :return: The last_body_excerpt of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self._last_body_excerpt

    @last_body_excerpt.setter
    def last_body_excerpt(self, last_body_excerpt):
        """Sets the last_body_excerpt of this EmailThreadProjection.

        Last body excerpt  # noqa: E501

        :param last_body_excerpt: The last_body_excerpt of this EmailThreadProjection.  # noqa: E501
        :type: str
        """

        self._last_body_excerpt = last_body_excerpt

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

        Last text excerpt  # noqa: E501

        :return: The last_text_excerpt of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self._last_text_excerpt

    @last_text_excerpt.setter
    def last_text_excerpt(self, last_text_excerpt):
        """Sets the last_text_excerpt of this EmailThreadProjection.

        Last text excerpt  # noqa: E501

        :param last_text_excerpt: The last_text_excerpt of this EmailThreadProjection.  # noqa: E501
        :type: str
        """

        self._last_text_excerpt = last_text_excerpt

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

        Last email created time  # noqa: E501

        :return: The last_created_at of this EmailThreadProjection.  # noqa: E501
        :rtype: datetime
        """
        return self._last_created_at

    @last_created_at.setter
    def last_created_at(self, last_created_at):
        """Sets the last_created_at of this EmailThreadProjection.

        Last email created time  # noqa: E501

        :param last_created_at: The last_created_at of this EmailThreadProjection.  # noqa: E501
        :type: datetime
        """

        self._last_created_at = last_created_at

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

        Last sender  # noqa: E501

        :return: The last_from of this EmailThreadProjection.  # noqa: E501
        :rtype: str
        """
        return self._last_from

    @last_from.setter
    def last_from(self, last_from):
        """Sets the last_from of this EmailThreadProjection.

        Last sender  # noqa: E501

        :param last_from: The last_from of this EmailThreadProjection.  # noqa: E501
        :type: str
        """

        self._last_from = last_from

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


        :return: The last_sender of this EmailThreadProjection.  # noqa: E501
        :rtype: SenderProjection
        """
        return self._last_sender

    @last_sender.setter
    def last_sender(self, last_sender):
        """Sets the last_sender of this EmailThreadProjection.


        :param last_sender: The last_sender of this EmailThreadProjection.  # noqa: E501
        :type: SenderProjection
        """

        self._last_sender = last_sender

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

        for attr, _ in six.iteritems(self.openapi_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 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, EmailThreadProjection):
            return False

        return self.to_dict() == other.to_dict()

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

        return self.to_dict() != other.to_dict()
