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.survey_answers import SurveyAnswers
from chromestatus_openapi import util

from chromestatus_openapi.models.survey_answers import SurveyAnswers  # noqa: E501

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

    Do not edit the class manually.
    """

    def __init__(self, id=None, feature_id=None, stage_id=None, gate_type=None, team_name=None, gate_name=None, escalation_email=None, state=None, requested_on=None, responded_on=None, assignee_emails=None, next_action=None, additional_review=None, slo_initial_response=5, slo_initial_response_took=None, slo_initial_response_remaining=None, slo_resolve=10, slo_resolve_took=None, slo_resolve_remaining=None, needs_work_started_on=None, possible_assignee_emails=None, self_certify_eligible=None, self_certify_possible=None, survey_answers=None):  # noqa: E501
        """Gate - a model defined in OpenAPI

        :param id: The id of this Gate.  # noqa: E501
        :type id: int
        :param feature_id: The feature_id of this Gate.  # noqa: E501
        :type feature_id: int
        :param stage_id: The stage_id of this Gate.  # noqa: E501
        :type stage_id: int
        :param gate_type: The gate_type of this Gate.  # noqa: E501
        :type gate_type: int
        :param team_name: The team_name of this Gate.  # noqa: E501
        :type team_name: str
        :param gate_name: The gate_name of this Gate.  # noqa: E501
        :type gate_name: str
        :param escalation_email: The escalation_email of this Gate.  # noqa: E501
        :type escalation_email: str
        :param state: The state of this Gate.  # noqa: E501
        :type state: int
        :param requested_on: The requested_on of this Gate.  # noqa: E501
        :type requested_on: datetime
        :param responded_on: The responded_on of this Gate.  # noqa: E501
        :type responded_on: datetime
        :param assignee_emails: The assignee_emails of this Gate.  # noqa: E501
        :type assignee_emails: List[str]
        :param next_action: The next_action of this Gate.  # noqa: E501
        :type next_action: str
        :param additional_review: The additional_review of this Gate.  # noqa: E501
        :type additional_review: bool
        :param slo_initial_response: The slo_initial_response of this Gate.  # noqa: E501
        :type slo_initial_response: int
        :param slo_initial_response_took: The slo_initial_response_took of this Gate.  # noqa: E501
        :type slo_initial_response_took: int
        :param slo_initial_response_remaining: The slo_initial_response_remaining of this Gate.  # noqa: E501
        :type slo_initial_response_remaining: int
        :param slo_resolve: The slo_resolve of this Gate.  # noqa: E501
        :type slo_resolve: int
        :param slo_resolve_took: The slo_resolve_took of this Gate.  # noqa: E501
        :type slo_resolve_took: int
        :param slo_resolve_remaining: The slo_resolve_remaining of this Gate.  # noqa: E501
        :type slo_resolve_remaining: int
        :param needs_work_started_on: The needs_work_started_on of this Gate.  # noqa: E501
        :type needs_work_started_on: datetime
        :param possible_assignee_emails: The possible_assignee_emails of this Gate.  # noqa: E501
        :type possible_assignee_emails: List[str]
        :param self_certify_eligible: The self_certify_eligible of this Gate.  # noqa: E501
        :type self_certify_eligible: bool
        :param self_certify_possible: The self_certify_possible of this Gate.  # noqa: E501
        :type self_certify_possible: bool
        :param survey_answers: The survey_answers of this Gate.  # noqa: E501
        :type survey_answers: SurveyAnswers
        """
        self.openapi_types = {
            'id': int,
            'feature_id': int,
            'stage_id': int,
            'gate_type': int,
            'team_name': str,
            'gate_name': str,
            'escalation_email': str,
            'state': int,
            'requested_on': datetime,
            'responded_on': datetime,
            'assignee_emails': List[str],
            'next_action': str,
            'additional_review': bool,
            'slo_initial_response': int,
            'slo_initial_response_took': int,
            'slo_initial_response_remaining': int,
            'slo_resolve': int,
            'slo_resolve_took': int,
            'slo_resolve_remaining': int,
            'needs_work_started_on': datetime,
            'possible_assignee_emails': List[str],
            'self_certify_eligible': bool,
            'self_certify_possible': bool,
            'survey_answers': SurveyAnswers
        }

        self.attribute_map = {
            'id': 'id',
            'feature_id': 'feature_id',
            'stage_id': 'stage_id',
            'gate_type': 'gate_type',
            'team_name': 'team_name',
            'gate_name': 'gate_name',
            'escalation_email': 'escalation_email',
            'state': 'state',
            'requested_on': 'requested_on',
            'responded_on': 'responded_on',
            'assignee_emails': 'assignee_emails',
            'next_action': 'next_action',
            'additional_review': 'additional_review',
            'slo_initial_response': 'slo_initial_response',
            'slo_initial_response_took': 'slo_initial_response_took',
            'slo_initial_response_remaining': 'slo_initial_response_remaining',
            'slo_resolve': 'slo_resolve',
            'slo_resolve_took': 'slo_resolve_took',
            'slo_resolve_remaining': 'slo_resolve_remaining',
            'needs_work_started_on': 'needs_work_started_on',
            'possible_assignee_emails': 'possible_assignee_emails',
            'self_certify_eligible': 'self_certify_eligible',
            'self_certify_possible': 'self_certify_possible',
            'survey_answers': 'survey_answers'
        }

        self._id = id
        self._feature_id = feature_id
        self._stage_id = stage_id
        self._gate_type = gate_type
        self._team_name = team_name
        self._gate_name = gate_name
        self._escalation_email = escalation_email
        self._state = state
        self._requested_on = requested_on
        self._responded_on = responded_on
        self._assignee_emails = assignee_emails
        self._next_action = next_action
        self._additional_review = additional_review
        self._slo_initial_response = slo_initial_response
        self._slo_initial_response_took = slo_initial_response_took
        self._slo_initial_response_remaining = slo_initial_response_remaining
        self._slo_resolve = slo_resolve
        self._slo_resolve_took = slo_resolve_took
        self._slo_resolve_remaining = slo_resolve_remaining
        self._needs_work_started_on = needs_work_started_on
        self._possible_assignee_emails = possible_assignee_emails
        self._self_certify_eligible = self_certify_eligible
        self._self_certify_possible = self_certify_possible
        self._survey_answers = survey_answers

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

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

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


        :return: The id of this Gate.
        :rtype: int
        """
        return self._id

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


        :param id: The id of this Gate.
        :type id: int
        """

        self._id = id

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


        :return: The feature_id of this Gate.
        :rtype: int
        """
        return self._feature_id

    @feature_id.setter
    def feature_id(self, feature_id: int):
        """Sets the feature_id of this Gate.


        :param feature_id: The feature_id of this Gate.
        :type feature_id: int
        """

        self._feature_id = feature_id

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


        :return: The stage_id of this Gate.
        :rtype: int
        """
        return self._stage_id

    @stage_id.setter
    def stage_id(self, stage_id: int):
        """Sets the stage_id of this Gate.


        :param stage_id: The stage_id of this Gate.
        :type stage_id: int
        """

        self._stage_id = stage_id

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


        :return: The gate_type of this Gate.
        :rtype: int
        """
        return self._gate_type

    @gate_type.setter
    def gate_type(self, gate_type: int):
        """Sets the gate_type of this Gate.


        :param gate_type: The gate_type of this Gate.
        :type gate_type: int
        """

        self._gate_type = gate_type

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


        :return: The team_name of this Gate.
        :rtype: str
        """
        return self._team_name

    @team_name.setter
    def team_name(self, team_name: str):
        """Sets the team_name of this Gate.


        :param team_name: The team_name of this Gate.
        :type team_name: str
        """

        self._team_name = team_name

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


        :return: The gate_name of this Gate.
        :rtype: str
        """
        return self._gate_name

    @gate_name.setter
    def gate_name(self, gate_name: str):
        """Sets the gate_name of this Gate.


        :param gate_name: The gate_name of this Gate.
        :type gate_name: str
        """

        self._gate_name = gate_name

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


        :return: The escalation_email of this Gate.
        :rtype: str
        """
        return self._escalation_email

    @escalation_email.setter
    def escalation_email(self, escalation_email: str):
        """Sets the escalation_email of this Gate.


        :param escalation_email: The escalation_email of this Gate.
        :type escalation_email: str
        """

        self._escalation_email = escalation_email

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


        :return: The state of this Gate.
        :rtype: int
        """
        return self._state

    @state.setter
    def state(self, state: int):
        """Sets the state of this Gate.


        :param state: The state of this Gate.
        :type state: int
        """

        self._state = state

    @property
    def requested_on(self) -> datetime:
        """Gets the requested_on of this Gate.


        :return: The requested_on of this Gate.
        :rtype: datetime
        """
        return self._requested_on

    @requested_on.setter
    def requested_on(self, requested_on: datetime):
        """Sets the requested_on of this Gate.


        :param requested_on: The requested_on of this Gate.
        :type requested_on: datetime
        """

        self._requested_on = requested_on

    @property
    def responded_on(self) -> datetime:
        """Gets the responded_on of this Gate.


        :return: The responded_on of this Gate.
        :rtype: datetime
        """
        return self._responded_on

    @responded_on.setter
    def responded_on(self, responded_on: datetime):
        """Sets the responded_on of this Gate.


        :param responded_on: The responded_on of this Gate.
        :type responded_on: datetime
        """

        self._responded_on = responded_on

    @property
    def assignee_emails(self) -> List[str]:
        """Gets the assignee_emails of this Gate.


        :return: The assignee_emails of this Gate.
        :rtype: List[str]
        """
        return self._assignee_emails

    @assignee_emails.setter
    def assignee_emails(self, assignee_emails: List[str]):
        """Sets the assignee_emails of this Gate.


        :param assignee_emails: The assignee_emails of this Gate.
        :type assignee_emails: List[str]
        """

        self._assignee_emails = assignee_emails

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


        :return: The next_action of this Gate.
        :rtype: str
        """
        return self._next_action

    @next_action.setter
    def next_action(self, next_action: str):
        """Sets the next_action of this Gate.


        :param next_action: The next_action of this Gate.
        :type next_action: str
        """

        self._next_action = next_action

    @property
    def additional_review(self) -> bool:
        """Gets the additional_review of this Gate.


        :return: The additional_review of this Gate.
        :rtype: bool
        """
        return self._additional_review

    @additional_review.setter
    def additional_review(self, additional_review: bool):
        """Sets the additional_review of this Gate.


        :param additional_review: The additional_review of this Gate.
        :type additional_review: bool
        """

        self._additional_review = additional_review

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

        DEFAULT_SLO_LIMIT is 5 in approval_defs.py  # noqa: E501

        :return: The slo_initial_response of this Gate.
        :rtype: int
        """
        return self._slo_initial_response

    @slo_initial_response.setter
    def slo_initial_response(self, slo_initial_response: int):
        """Sets the slo_initial_response of this Gate.

        DEFAULT_SLO_LIMIT is 5 in approval_defs.py  # noqa: E501

        :param slo_initial_response: The slo_initial_response of this Gate.
        :type slo_initial_response: int
        """

        self._slo_initial_response = slo_initial_response

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


        :return: The slo_initial_response_took of this Gate.
        :rtype: int
        """
        return self._slo_initial_response_took

    @slo_initial_response_took.setter
    def slo_initial_response_took(self, slo_initial_response_took: int):
        """Sets the slo_initial_response_took of this Gate.


        :param slo_initial_response_took: The slo_initial_response_took of this Gate.
        :type slo_initial_response_took: int
        """

        self._slo_initial_response_took = slo_initial_response_took

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


        :return: The slo_initial_response_remaining of this Gate.
        :rtype: int
        """
        return self._slo_initial_response_remaining

    @slo_initial_response_remaining.setter
    def slo_initial_response_remaining(self, slo_initial_response_remaining: int):
        """Sets the slo_initial_response_remaining of this Gate.


        :param slo_initial_response_remaining: The slo_initial_response_remaining of this Gate.
        :type slo_initial_response_remaining: int
        """

        self._slo_initial_response_remaining = slo_initial_response_remaining

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

        DEFAULT_SLO_RESOLVE_LIMIT is 10 in approval_defs.py  # noqa: E501

        :return: The slo_resolve of this Gate.
        :rtype: int
        """
        return self._slo_resolve

    @slo_resolve.setter
    def slo_resolve(self, slo_resolve: int):
        """Sets the slo_resolve of this Gate.

        DEFAULT_SLO_RESOLVE_LIMIT is 10 in approval_defs.py  # noqa: E501

        :param slo_resolve: The slo_resolve of this Gate.
        :type slo_resolve: int
        """

        self._slo_resolve = slo_resolve

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


        :return: The slo_resolve_took of this Gate.
        :rtype: int
        """
        return self._slo_resolve_took

    @slo_resolve_took.setter
    def slo_resolve_took(self, slo_resolve_took: int):
        """Sets the slo_resolve_took of this Gate.


        :param slo_resolve_took: The slo_resolve_took of this Gate.
        :type slo_resolve_took: int
        """

        self._slo_resolve_took = slo_resolve_took

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


        :return: The slo_resolve_remaining of this Gate.
        :rtype: int
        """
        return self._slo_resolve_remaining

    @slo_resolve_remaining.setter
    def slo_resolve_remaining(self, slo_resolve_remaining: int):
        """Sets the slo_resolve_remaining of this Gate.


        :param slo_resolve_remaining: The slo_resolve_remaining of this Gate.
        :type slo_resolve_remaining: int
        """

        self._slo_resolve_remaining = slo_resolve_remaining

    @property
    def needs_work_started_on(self) -> datetime:
        """Gets the needs_work_started_on of this Gate.


        :return: The needs_work_started_on of this Gate.
        :rtype: datetime
        """
        return self._needs_work_started_on

    @needs_work_started_on.setter
    def needs_work_started_on(self, needs_work_started_on: datetime):
        """Sets the needs_work_started_on of this Gate.


        :param needs_work_started_on: The needs_work_started_on of this Gate.
        :type needs_work_started_on: datetime
        """

        self._needs_work_started_on = needs_work_started_on

    @property
    def possible_assignee_emails(self) -> List[str]:
        """Gets the possible_assignee_emails of this Gate.


        :return: The possible_assignee_emails of this Gate.
        :rtype: List[str]
        """
        return self._possible_assignee_emails

    @possible_assignee_emails.setter
    def possible_assignee_emails(self, possible_assignee_emails: List[str]):
        """Sets the possible_assignee_emails of this Gate.


        :param possible_assignee_emails: The possible_assignee_emails of this Gate.
        :type possible_assignee_emails: List[str]
        """

        self._possible_assignee_emails = possible_assignee_emails

    @property
    def self_certify_eligible(self) -> bool:
        """Gets the self_certify_eligible of this Gate.


        :return: The self_certify_eligible of this Gate.
        :rtype: bool
        """
        return self._self_certify_eligible

    @self_certify_eligible.setter
    def self_certify_eligible(self, self_certify_eligible: bool):
        """Sets the self_certify_eligible of this Gate.


        :param self_certify_eligible: The self_certify_eligible of this Gate.
        :type self_certify_eligible: bool
        """

        self._self_certify_eligible = self_certify_eligible

    @property
    def self_certify_possible(self) -> bool:
        """Gets the self_certify_possible of this Gate.


        :return: The self_certify_possible of this Gate.
        :rtype: bool
        """
        return self._self_certify_possible

    @self_certify_possible.setter
    def self_certify_possible(self, self_certify_possible: bool):
        """Sets the self_certify_possible of this Gate.


        :param self_certify_possible: The self_certify_possible of this Gate.
        :type self_certify_possible: bool
        """

        self._self_certify_possible = self_certify_possible

    @property
    def survey_answers(self) -> SurveyAnswers:
        """Gets the survey_answers of this Gate.


        :return: The survey_answers of this Gate.
        :rtype: SurveyAnswers
        """
        return self._survey_answers

    @survey_answers.setter
    def survey_answers(self, survey_answers: SurveyAnswers):
        """Sets the survey_answers of this Gate.


        :param survey_answers: The survey_answers of this Gate.
        :type survey_answers: SurveyAnswers
        """

        self._survey_answers = survey_answers
