# 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 CreateDeliverabilityTestOptions(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 = {
        'name': 'str',
        'description': 'str',
        'scope': 'str',
        'start_at': 'datetime',
        'max_duration_seconds': 'int',
        'success_threshold_percent': 'float',
        'selector': 'DeliverabilitySelectorOptions',
        'expectations': 'list[DeliverabilityExpectation]'
    }

    attribute_map = {
        'name': 'name',
        'description': 'description',
        'scope': 'scope',
        'start_at': 'startAt',
        'max_duration_seconds': 'maxDurationSeconds',
        'success_threshold_percent': 'successThresholdPercent',
        'selector': 'selector',
        'expectations': 'expectations'
    }

    def __init__(self, name=None, description=None, scope=None, start_at=None, max_duration_seconds=None, success_threshold_percent=None, selector=None, expectations=None, local_vars_configuration=None):  # noqa: E501
        """CreateDeliverabilityTestOptions - 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._name = None
        self._description = None
        self._scope = None
        self._start_at = None
        self._max_duration_seconds = None
        self._success_threshold_percent = None
        self._selector = None
        self._expectations = None
        self.discriminator = None

        self.name = name
        self.description = description
        self.scope = scope
        self.start_at = start_at
        self.max_duration_seconds = max_duration_seconds
        self.success_threshold_percent = success_threshold_percent
        self.selector = selector
        self.expectations = expectations

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

        Optional name for the test  # noqa: E501

        :return: The name of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: str
        """
        return self._name

    @name.setter
    def name(self, name):
        """Sets the name of this CreateDeliverabilityTestOptions.

        Optional name for the test  # noqa: E501

        :param name: The name of this CreateDeliverabilityTestOptions.  # noqa: E501
        :type: str
        """

        self._name = name

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

        Optional description  # noqa: E501

        :return: The description of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: str
        """
        return self._description

    @description.setter
    def description(self, description):
        """Sets the description of this CreateDeliverabilityTestOptions.

        Optional description  # noqa: E501

        :param description: The description of this CreateDeliverabilityTestOptions.  # noqa: E501
        :type: str
        """

        self._description = description

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

        Entity scope to evaluate  # noqa: E501

        :return: The scope of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: str
        """
        return self._scope

    @scope.setter
    def scope(self, scope):
        """Sets the scope of this CreateDeliverabilityTestOptions.

        Entity scope to evaluate  # noqa: E501

        :param scope: The scope of this CreateDeliverabilityTestOptions.  # noqa: E501
        :type: str
        """
        if self.local_vars_configuration.client_side_validation and scope is None:  # noqa: E501
            raise ValueError("Invalid value for `scope`, must not be `None`")  # noqa: E501
        allowed_values = ["INBOX", "PHONE"]  # noqa: E501
        if self.local_vars_configuration.client_side_validation and scope not in allowed_values:  # noqa: E501
            raise ValueError(
                "Invalid value for `scope` ({0}), must be one of {1}"  # noqa: E501
                .format(scope, allowed_values)
            )

        self._scope = scope

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

        UTC instant when the receive window starts. Defaults to now if omitted.  # noqa: E501

        :return: The start_at of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: datetime
        """
        return self._start_at

    @start_at.setter
    def start_at(self, start_at):
        """Sets the start_at of this CreateDeliverabilityTestOptions.

        UTC instant when the receive window starts. Defaults to now if omitted.  # noqa: E501

        :param start_at: The start_at of this CreateDeliverabilityTestOptions.  # noqa: E501
        :type: datetime
        """

        self._start_at = start_at

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

        Optional timeout in seconds after startAt. If not all entities match before timeout the test transitions to FAILED.  # noqa: E501

        :return: The max_duration_seconds of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: int
        """
        return self._max_duration_seconds

    @max_duration_seconds.setter
    def max_duration_seconds(self, max_duration_seconds):
        """Sets the max_duration_seconds of this CreateDeliverabilityTestOptions.

        Optional timeout in seconds after startAt. If not all entities match before timeout the test transitions to FAILED.  # noqa: E501

        :param max_duration_seconds: The max_duration_seconds of this CreateDeliverabilityTestOptions.  # noqa: E501
        :type: int
        """
        if (self.local_vars_configuration.client_side_validation and
                max_duration_seconds is not None and max_duration_seconds < 1):  # noqa: E501
            raise ValueError("Invalid value for `max_duration_seconds`, must be a value greater than or equal to `1`")  # noqa: E501

        self._max_duration_seconds = max_duration_seconds

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

        Optional acceptable success threshold percentage (0,100]. If set, a timed-out test can complete successfully when matchedEntities/totalEntities reaches this percentage.  # noqa: E501

        :return: The success_threshold_percent of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: float
        """
        return self._success_threshold_percent

    @success_threshold_percent.setter
    def success_threshold_percent(self, success_threshold_percent):
        """Sets the success_threshold_percent of this CreateDeliverabilityTestOptions.

        Optional acceptable success threshold percentage (0,100]. If set, a timed-out test can complete successfully when matchedEntities/totalEntities reaches this percentage.  # noqa: E501

        :param success_threshold_percent: The success_threshold_percent of this CreateDeliverabilityTestOptions.  # noqa: E501
        :type: float
        """
        if (self.local_vars_configuration.client_side_validation and
                success_threshold_percent is not None and success_threshold_percent > 100.0):  # noqa: E501
            raise ValueError("Invalid value for `success_threshold_percent`, must be a value less than or equal to `100.0`")  # noqa: E501
        if (self.local_vars_configuration.client_side_validation and
                success_threshold_percent is not None and success_threshold_percent <= 0.0):  # noqa: E501
            raise ValueError("Invalid value for `success_threshold_percent`, must be a value greater than `0.0`")  # noqa: E501

        self._success_threshold_percent = success_threshold_percent

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


        :return: The selector of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: DeliverabilitySelectorOptions
        """
        return self._selector

    @selector.setter
    def selector(self, selector):
        """Sets the selector of this CreateDeliverabilityTestOptions.


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

        self._selector = selector

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

        One or more expectations to evaluate for each entity  # noqa: E501

        :return: The expectations of this CreateDeliverabilityTestOptions.  # noqa: E501
        :rtype: list[DeliverabilityExpectation]
        """
        return self._expectations

    @expectations.setter
    def expectations(self, expectations):
        """Sets the expectations of this CreateDeliverabilityTestOptions.

        One or more expectations to evaluate for each entity  # noqa: E501

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

        self._expectations = expectations

    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, CreateDeliverabilityTestOptions):
            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, CreateDeliverabilityTestOptions):
            return True

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