# 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 StructuredOutputSchema(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 = {
        'any_of': 'list[StructuredOutputSchema]',
        'default': 'object',
        'description': 'str',
        'enum': 'list[str]',
        'example': 'object',
        'format': 'str',
        'items': 'StructuredOutputSchema',
        'max_items': 'int',
        'min_items': 'int',
        'max_length': 'int',
        'min_length': 'int',
        'pattern': 'str',
        'properties': 'dict(str, StructuredOutputSchema)',
        'property_ordering': 'list[str]',
        'required': 'list[str]',
        'max_properties': 'int',
        'min_properties': 'int',
        'maximum': 'float',
        'minimum': 'float',
        'nullable': 'bool',
        'title': 'str',
        'type': 'str'
    }

    attribute_map = {
        'any_of': 'anyOf',
        'default': 'default',
        'description': 'description',
        'enum': 'enum',
        'example': 'example',
        'format': 'format',
        'items': 'items',
        'max_items': 'maxItems',
        'min_items': 'minItems',
        'max_length': 'maxLength',
        'min_length': 'minLength',
        'pattern': 'pattern',
        'properties': 'properties',
        'property_ordering': 'propertyOrdering',
        'required': 'required',
        'max_properties': 'maxProperties',
        'min_properties': 'minProperties',
        'maximum': 'maximum',
        'minimum': 'minimum',
        'nullable': 'nullable',
        'title': 'title',
        'type': 'type'
    }

    def __init__(self, any_of=None, default=None, description=None, enum=None, example=None, format=None, items=None, max_items=None, min_items=None, max_length=None, min_length=None, pattern=None, properties=None, property_ordering=None, required=None, max_properties=None, min_properties=None, maximum=None, minimum=None, nullable=None, title=None, type=None, local_vars_configuration=None):  # noqa: E501
        """StructuredOutputSchema - 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._any_of = None
        self._default = None
        self._description = None
        self._enum = None
        self._example = None
        self._format = None
        self._items = None
        self._max_items = None
        self._min_items = None
        self._max_length = None
        self._min_length = None
        self._pattern = None
        self._properties = None
        self._property_ordering = None
        self._required = None
        self._max_properties = None
        self._min_properties = None
        self._maximum = None
        self._minimum = None
        self._nullable = None
        self._title = None
        self._type = None
        self.discriminator = None

        self.any_of = any_of
        self.default = default
        self.description = description
        self.enum = enum
        self.example = example
        self.format = format
        if items is not None:
            self.items = items
        self.max_items = max_items
        self.min_items = min_items
        self.max_length = max_length
        self.min_length = min_length
        self.pattern = pattern
        self.properties = properties
        self.property_ordering = property_ordering
        self.required = required
        self.max_properties = max_properties
        self.min_properties = min_properties
        self.maximum = maximum
        self.minimum = minimum
        self.nullable = nullable
        self.title = title
        self.type = type

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


        :return: The any_of of this StructuredOutputSchema.  # noqa: E501
        :rtype: list[StructuredOutputSchema]
        """
        return self._any_of

    @any_of.setter
    def any_of(self, any_of):
        """Sets the any_of of this StructuredOutputSchema.


        :param any_of: The any_of of this StructuredOutputSchema.  # noqa: E501
        :type: list[StructuredOutputSchema]
        """

        self._any_of = any_of

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


        :return: The default of this StructuredOutputSchema.  # noqa: E501
        :rtype: object
        """
        return self._default

    @default.setter
    def default(self, default):
        """Sets the default of this StructuredOutputSchema.


        :param default: The default of this StructuredOutputSchema.  # noqa: E501
        :type: object
        """

        self._default = default

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

        Provide a description of the schema to help the AI understand the schema.  # noqa: E501

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

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

        Provide a description of the schema to help the AI understand the schema.  # noqa: E501

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

        self._description = description

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

        When using type string and format enum pass a collection of enum values here.  # noqa: E501

        :return: The enum of this StructuredOutputSchema.  # noqa: E501
        :rtype: list[str]
        """
        return self._enum

    @enum.setter
    def enum(self, enum):
        """Sets the enum of this StructuredOutputSchema.

        When using type string and format enum pass a collection of enum values here.  # noqa: E501

        :param enum: The enum of this StructuredOutputSchema.  # noqa: E501
        :type: list[str]
        """

        self._enum = enum

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


        :return: The example of this StructuredOutputSchema.  # noqa: E501
        :rtype: object
        """
        return self._example

    @example.setter
    def example(self, example):
        """Sets the example of this StructuredOutputSchema.


        :param example: The example of this StructuredOutputSchema.  # noqa: E501
        :type: object
        """

        self._example = example

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

        Format for string types. Can be null, date-time or enum.  # noqa: E501

        :return: The format of this StructuredOutputSchema.  # noqa: E501
        :rtype: str
        """
        return self._format

    @format.setter
    def format(self, format):
        """Sets the format of this StructuredOutputSchema.

        Format for string types. Can be null, date-time or enum.  # noqa: E501

        :param format: The format of this StructuredOutputSchema.  # noqa: E501
        :type: str
        """

        self._format = format

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


        :return: The items of this StructuredOutputSchema.  # noqa: E501
        :rtype: StructuredOutputSchema
        """
        return self._items

    @items.setter
    def items(self, items):
        """Sets the items of this StructuredOutputSchema.


        :param items: The items of this StructuredOutputSchema.  # noqa: E501
        :type: StructuredOutputSchema
        """

        self._items = items

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


        :return: The max_items of this StructuredOutputSchema.  # noqa: E501
        :rtype: int
        """
        return self._max_items

    @max_items.setter
    def max_items(self, max_items):
        """Sets the max_items of this StructuredOutputSchema.


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

        self._max_items = max_items

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


        :return: The min_items of this StructuredOutputSchema.  # noqa: E501
        :rtype: int
        """
        return self._min_items

    @min_items.setter
    def min_items(self, min_items):
        """Sets the min_items of this StructuredOutputSchema.


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

        self._min_items = min_items

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


        :return: The max_length of this StructuredOutputSchema.  # noqa: E501
        :rtype: int
        """
        return self._max_length

    @max_length.setter
    def max_length(self, max_length):
        """Sets the max_length of this StructuredOutputSchema.


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

        self._max_length = max_length

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


        :return: The min_length of this StructuredOutputSchema.  # noqa: E501
        :rtype: int
        """
        return self._min_length

    @min_length.setter
    def min_length(self, min_length):
        """Sets the min_length of this StructuredOutputSchema.


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

        self._min_length = min_length

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


        :return: The pattern of this StructuredOutputSchema.  # noqa: E501
        :rtype: str
        """
        return self._pattern

    @pattern.setter
    def pattern(self, pattern):
        """Sets the pattern of this StructuredOutputSchema.


        :param pattern: The pattern of this StructuredOutputSchema.  # noqa: E501
        :type: str
        """

        self._pattern = pattern

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

        Properties of an OBJECT schema. These are key value pairs where the key is the property name and the value is the schema for that property.  # noqa: E501

        :return: The properties of this StructuredOutputSchema.  # noqa: E501
        :rtype: dict(str, StructuredOutputSchema)
        """
        return self._properties

    @properties.setter
    def properties(self, properties):
        """Sets the properties of this StructuredOutputSchema.

        Properties of an OBJECT schema. These are key value pairs where the key is the property name and the value is the schema for that property.  # noqa: E501

        :param properties: The properties of this StructuredOutputSchema.  # noqa: E501
        :type: dict(str, StructuredOutputSchema)
        """

        self._properties = properties

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

        Pass an array of property names to specify the order of properties in the generated JSON object if required.  # noqa: E501

        :return: The property_ordering of this StructuredOutputSchema.  # noqa: E501
        :rtype: list[str]
        """
        return self._property_ordering

    @property_ordering.setter
    def property_ordering(self, property_ordering):
        """Sets the property_ordering of this StructuredOutputSchema.

        Pass an array of property names to specify the order of properties in the generated JSON object if required.  # noqa: E501

        :param property_ordering: The property_ordering of this StructuredOutputSchema.  # noqa: E501
        :type: list[str]
        """

        self._property_ordering = property_ordering

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


        :return: The required of this StructuredOutputSchema.  # noqa: E501
        :rtype: list[str]
        """
        return self._required

    @required.setter
    def required(self, required):
        """Sets the required of this StructuredOutputSchema.


        :param required: The required of this StructuredOutputSchema.  # noqa: E501
        :type: list[str]
        """

        self._required = required

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


        :return: The max_properties of this StructuredOutputSchema.  # noqa: E501
        :rtype: int
        """
        return self._max_properties

    @max_properties.setter
    def max_properties(self, max_properties):
        """Sets the max_properties of this StructuredOutputSchema.


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

        self._max_properties = max_properties

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


        :return: The min_properties of this StructuredOutputSchema.  # noqa: E501
        :rtype: int
        """
        return self._min_properties

    @min_properties.setter
    def min_properties(self, min_properties):
        """Sets the min_properties of this StructuredOutputSchema.


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

        self._min_properties = min_properties

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


        :return: The maximum of this StructuredOutputSchema.  # noqa: E501
        :rtype: float
        """
        return self._maximum

    @maximum.setter
    def maximum(self, maximum):
        """Sets the maximum of this StructuredOutputSchema.


        :param maximum: The maximum of this StructuredOutputSchema.  # noqa: E501
        :type: float
        """

        self._maximum = maximum

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


        :return: The minimum of this StructuredOutputSchema.  # noqa: E501
        :rtype: float
        """
        return self._minimum

    @minimum.setter
    def minimum(self, minimum):
        """Sets the minimum of this StructuredOutputSchema.


        :param minimum: The minimum of this StructuredOutputSchema.  # noqa: E501
        :type: float
        """

        self._minimum = minimum

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


        :return: The nullable of this StructuredOutputSchema.  # noqa: E501
        :rtype: bool
        """
        return self._nullable

    @nullable.setter
    def nullable(self, nullable):
        """Sets the nullable of this StructuredOutputSchema.


        :param nullable: The nullable of this StructuredOutputSchema.  # noqa: E501
        :type: bool
        """

        self._nullable = nullable

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


        :return: The title of this StructuredOutputSchema.  # noqa: E501
        :rtype: str
        """
        return self._title

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


        :param title: The title of this StructuredOutputSchema.  # noqa: E501
        :type: str
        """

        self._title = title

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

        Primitive JSON schema types with a fallback CUSTOM for unknown values.  # noqa: E501

        :return: The type of this StructuredOutputSchema.  # noqa: E501
        :rtype: str
        """
        return self._type

    @type.setter
    def type(self, type):
        """Sets the type of this StructuredOutputSchema.

        Primitive JSON schema types with a fallback CUSTOM for unknown values.  # noqa: E501

        :param type: The type of this StructuredOutputSchema.  # noqa: E501
        :type: str
        """
        allowed_values = [None,"string", "number", "integer", "boolean", "object", "array", "null"]  # noqa: E501
        if self.local_vars_configuration.client_side_validation and type not in allowed_values:  # noqa: E501
            raise ValueError(
                "Invalid value for `type` ({0}), must be one of {1}"  # noqa: E501
                .format(type, allowed_values)
            )

        self._type = type

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

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