from datetime import date, datetime  # noqa: F401

from typing import List, Dict  # noqa: F401

from chromestatus_openapi.models.base_model import Model
from chromestatus_openapi.models.action import Action
from chromestatus_openapi.models.gate_info import GateInfo
from chromestatus_openapi.models.progress_item import ProgressItem
from chromestatus_openapi import util

from chromestatus_openapi.models.action import Action  # noqa: E501
from chromestatus_openapi.models.gate_info import GateInfo  # noqa: E501
from chromestatus_openapi.models.progress_item import ProgressItem  # noqa: E501

class ProcessStage(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, description=None, progress_items=None, actions=None, approvals=None, incoming_stage=None, outgoing_stage=None, stage_type=None):  # noqa: E501
        """ProcessStage - a model defined in OpenAPI

        :param name: The name of this ProcessStage.  # noqa: E501
        :type name: str
        :param description: The description of this ProcessStage.  # noqa: E501
        :type description: str
        :param progress_items: The progress_items of this ProcessStage.  # noqa: E501
        :type progress_items: List[ProgressItem]
        :param actions: The actions of this ProcessStage.  # noqa: E501
        :type actions: List[Action]
        :param approvals: The approvals of this ProcessStage.  # noqa: E501
        :type approvals: List[GateInfo]
        :param incoming_stage: The incoming_stage of this ProcessStage.  # noqa: E501
        :type incoming_stage: int
        :param outgoing_stage: The outgoing_stage of this ProcessStage.  # noqa: E501
        :type outgoing_stage: int
        :param stage_type: The stage_type of this ProcessStage.  # noqa: E501
        :type stage_type: int
        """
        self.openapi_types = {
            'name': str,
            'description': str,
            'progress_items': List[ProgressItem],
            'actions': List[Action],
            'approvals': List[GateInfo],
            'incoming_stage': int,
            'outgoing_stage': int,
            'stage_type': int
        }

        self.attribute_map = {
            'name': 'name',
            'description': 'description',
            'progress_items': 'progress_items',
            'actions': 'actions',
            'approvals': 'approvals',
            'incoming_stage': 'incoming_stage',
            'outgoing_stage': 'outgoing_stage',
            'stage_type': 'stage_type'
        }

        self._name = name
        self._description = description
        self._progress_items = progress_items
        self._actions = actions
        self._approvals = approvals
        self._incoming_stage = incoming_stage
        self._outgoing_stage = outgoing_stage
        self._stage_type = stage_type

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

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

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


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

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


        :param name: The name of this ProcessStage.
        :type name: str
        """

        self._name = name

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


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

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


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

        self._description = description

    @property
    def progress_items(self) -> List[ProgressItem]:
        """Gets the progress_items of this ProcessStage.


        :return: The progress_items of this ProcessStage.
        :rtype: List[ProgressItem]
        """
        return self._progress_items

    @progress_items.setter
    def progress_items(self, progress_items: List[ProgressItem]):
        """Sets the progress_items of this ProcessStage.


        :param progress_items: The progress_items of this ProcessStage.
        :type progress_items: List[ProgressItem]
        """

        self._progress_items = progress_items

    @property
    def actions(self) -> List[Action]:
        """Gets the actions of this ProcessStage.


        :return: The actions of this ProcessStage.
        :rtype: List[Action]
        """
        return self._actions

    @actions.setter
    def actions(self, actions: List[Action]):
        """Sets the actions of this ProcessStage.


        :param actions: The actions of this ProcessStage.
        :type actions: List[Action]
        """

        self._actions = actions

    @property
    def approvals(self) -> List[GateInfo]:
        """Gets the approvals of this ProcessStage.


        :return: The approvals of this ProcessStage.
        :rtype: List[GateInfo]
        """
        return self._approvals

    @approvals.setter
    def approvals(self, approvals: List[GateInfo]):
        """Sets the approvals of this ProcessStage.


        :param approvals: The approvals of this ProcessStage.
        :type approvals: List[GateInfo]
        """

        self._approvals = approvals

    @property
    def incoming_stage(self) -> int:
        """Gets the incoming_stage of this ProcessStage.


        :return: The incoming_stage of this ProcessStage.
        :rtype: int
        """
        return self._incoming_stage

    @incoming_stage.setter
    def incoming_stage(self, incoming_stage: int):
        """Sets the incoming_stage of this ProcessStage.


        :param incoming_stage: The incoming_stage of this ProcessStage.
        :type incoming_stage: int
        """

        self._incoming_stage = incoming_stage

    @property
    def outgoing_stage(self) -> int:
        """Gets the outgoing_stage of this ProcessStage.


        :return: The outgoing_stage of this ProcessStage.
        :rtype: int
        """
        return self._outgoing_stage

    @outgoing_stage.setter
    def outgoing_stage(self, outgoing_stage: int):
        """Sets the outgoing_stage of this ProcessStage.


        :param outgoing_stage: The outgoing_stage of this ProcessStage.
        :type outgoing_stage: int
        """

        self._outgoing_stage = outgoing_stage

    @property
    def stage_type(self) -> int:
        """Gets the stage_type of this ProcessStage.


        :return: The stage_type of this ProcessStage.
        :rtype: int
        """
        return self._stage_type

    @stage_type.setter
    def stage_type(self, stage_type: int):
        """Sets the stage_type of this ProcessStage.


        :param stage_type: The stage_type of this ProcessStage.
        :type stage_type: int
        """

        self._stage_type = stage_type
