from datetime import date, datetime  # noqa: F401

from typing import List, Dict  # noqa: F401

from openapi_server.models.base_model import Model
from openapi_server.models.td_python_method_info import TdPythonMethodInfo
from openapi_server.models.td_python_property_info import TdPythonPropertyInfo
from openapi_server import util

from openapi_server.models.td_python_method_info import TdPythonMethodInfo  # noqa: E501
from openapi_server.models.td_python_property_info import TdPythonPropertyInfo  # noqa: E501

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

    Do not edit the class manually.
    """

    def __init__(self, name=None, type=None, description=None, methods=None, properties=None):  # noqa: E501
        """TdPythonClassDetails - a model defined in OpenAPI

        :param name: The name of this TdPythonClassDetails.  # noqa: E501
        :type name: str
        :param type: The type of this TdPythonClassDetails.  # noqa: E501
        :type type: str
        :param description: The description of this TdPythonClassDetails.  # noqa: E501
        :type description: str
        :param methods: The methods of this TdPythonClassDetails.  # noqa: E501
        :type methods: List[TdPythonMethodInfo]
        :param properties: The properties of this TdPythonClassDetails.  # noqa: E501
        :type properties: List[TdPythonPropertyInfo]
        """
        self.openapi_types = {
            'name': str,
            'type': str,
            'description': str,
            'methods': List[TdPythonMethodInfo],
            'properties': List[TdPythonPropertyInfo]
        }

        self.attribute_map = {
            'name': 'name',
            'type': 'type',
            'description': 'description',
            'methods': 'methods',
            'properties': 'properties'
        }

        self._name = name
        self._type = type
        self._description = description
        self._methods = methods
        self._properties = properties

    @classmethod
    def from_dict(cls, dikt) -> 'TdPythonClassDetails':
        """Returns the dict as a model

        :param dikt: A dict.
        :type: dict
        :return: The TdPythonClassDetails of this TdPythonClassDetails.  # noqa: E501
        :rtype: TdPythonClassDetails
        """
        return util.deserialize_model(dikt, cls)

    @property
    def name(self) -> str:
        """Gets the name of this TdPythonClassDetails.

        Name of the class or module  # noqa: E501

        :return: The name of this TdPythonClassDetails.
        :rtype: str
        """
        return self._name

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

        Name of the class or module  # noqa: E501

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

        self._name = name

    @property
    def type(self) -> str:
        """Gets the type of this TdPythonClassDetails.

        Type of the Python entity  # noqa: E501

        :return: The type of this TdPythonClassDetails.
        :rtype: str
        """
        return self._type

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

        Type of the Python entity  # noqa: E501

        :param type: The type of this TdPythonClassDetails.
        :type type: str
        """
        allowed_values = ["class", "module", "function", "object"]  # noqa: E501
        if type not in allowed_values:
            raise ValueError(
                "Invalid value for `type` ({0}), must be one of {1}"
                .format(type, allowed_values)
            )

        self._type = type

    @property
    def description(self) -> str:
        """Gets the description of this TdPythonClassDetails.

        Description of the class or module  # noqa: E501

        :return: The description of this TdPythonClassDetails.
        :rtype: str
        """
        return self._description

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

        Description of the class or module  # noqa: E501

        :param description: The description of this TdPythonClassDetails.
        :type description: str
        """

        self._description = description

    @property
    def methods(self) -> List[TdPythonMethodInfo]:
        """Gets the methods of this TdPythonClassDetails.

        List of methods available in the class or module  # noqa: E501

        :return: The methods of this TdPythonClassDetails.
        :rtype: List[TdPythonMethodInfo]
        """
        return self._methods

    @methods.setter
    def methods(self, methods: List[TdPythonMethodInfo]):
        """Sets the methods of this TdPythonClassDetails.

        List of methods available in the class or module  # noqa: E501

        :param methods: The methods of this TdPythonClassDetails.
        :type methods: List[TdPythonMethodInfo]
        """
        if methods is None:
            raise ValueError("Invalid value for `methods`, must not be `None`")  # noqa: E501

        self._methods = methods

    @property
    def properties(self) -> List[TdPythonPropertyInfo]:
        """Gets the properties of this TdPythonClassDetails.

        List of properties available in the class or module  # noqa: E501

        :return: The properties of this TdPythonClassDetails.
        :rtype: List[TdPythonPropertyInfo]
        """
        return self._properties

    @properties.setter
    def properties(self, properties: List[TdPythonPropertyInfo]):
        """Sets the properties of this TdPythonClassDetails.

        List of properties available in the class or module  # noqa: E501

        :param properties: The properties of this TdPythonClassDetails.
        :type properties: List[TdPythonPropertyInfo]
        """
        if properties is None:
            raise ValueError("Invalid value for `properties`, must not be `None`")  # noqa: E501

        self._properties = properties
