# coding: utf-8

from __future__ import absolute_import
from datetime import date, datetime  # noqa: F401

from typing import List, Dict  # noqa: F401

from swagger_server.models.base_model_ import Model
from swagger_server.models.query_terms import QueryTerms  # noqa: F401,E501
from swagger_server import util


class Query(Model):
    """NOTE: This class is auto generated by the swagger code generator program.

    Do not edit the class manually.
    """

    def __init__(self, original_question: str=None, restated_question: str=None, message: str=None, known_query_type_id: str=None, query_type_id: str=None, bypass_cache: str=None, asynchronous: str=None, options: str=None, max_results: int=None, page_size: int=None, page_number: int=None, terms: QueryTerms=None, reasoner_ids: List[str]=None, query_plan: List[object]=None):  # noqa: E501
        """Query - a model defined in Swagger

        :param original_question: The original_question of this Query.  # noqa: E501
        :type original_question: str
        :param restated_question: The restated_question of this Query.  # noqa: E501
        :type restated_question: str
        :param message: The message of this Query.  # noqa: E501
        :type message: str
        :param known_query_type_id: The known_query_type_id of this Query.  # noqa: E501
        :type known_query_type_id: str
        :param query_type_id: The query_type_id of this Query.  # noqa: E501
        :type query_type_id: str
        :param bypass_cache: The bypass_cache of this Query.  # noqa: E501
        :type bypass_cache: str
        :param asynchronous: The asynchronous of this Query.  # noqa: E501
        :type asynchronous: str
        :param options: The options of this Query.  # noqa: E501
        :type options: str
        :param max_results: The max_results of this Query.  # noqa: E501
        :type max_results: int
        :param page_size: The page_size of this Query.  # noqa: E501
        :type page_size: int
        :param page_number: The page_number of this Query.  # noqa: E501
        :type page_number: int
        :param terms: The terms of this Query.  # noqa: E501
        :type terms: QueryTerms
        :param reasoner_ids: The reasoner_ids of this Query.  # noqa: E501
        :type reasoner_ids: List[str]
        :param query_plan: The query_plan of this Query.  # noqa: E501
        :type query_plan: List[object]
        """
        self.swagger_types = {
            'original_question': str,
            'restated_question': str,
            'message': str,
            'known_query_type_id': str,
            'query_type_id': str,
            'bypass_cache': str,
            'asynchronous': str,
            'options': str,
            'max_results': int,
            'page_size': int,
            'page_number': int,
            'terms': QueryTerms,
            'reasoner_ids': List[str],
            'query_plan': List[object]
        }

        self.attribute_map = {
            'original_question': 'original_question',
            'restated_question': 'restated_question',
            'message': 'message',
            'known_query_type_id': 'known_query_type_id',
            'query_type_id': 'query_type_id',
            'bypass_cache': 'bypass_cache',
            'asynchronous': 'asynchronous',
            'options': 'options',
            'max_results': 'max_results',
            'page_size': 'page_size',
            'page_number': 'page_number',
            'terms': 'terms',
            'reasoner_ids': 'reasoner_ids',
            'query_plan': 'query_plan'
        }

        self._original_question = original_question
        self._restated_question = restated_question
        self._message = message
        self._known_query_type_id = known_query_type_id
        self._query_type_id = query_type_id
        self._bypass_cache = bypass_cache
        self._asynchronous = asynchronous
        self._options = options
        self._max_results = max_results
        self._page_size = page_size
        self._page_number = page_number
        self._terms = terms
        self._reasoner_ids = reasoner_ids
        self._query_plan = query_plan

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

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

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

        Original question as it was typed in by the user  # noqa: E501

        :return: The original_question of this Query.
        :rtype: str
        """
        return self._original_question

    @original_question.setter
    def original_question(self, original_question: str):
        """Sets the original_question of this Query.

        Original question as it was typed in by the user  # noqa: E501

        :param original_question: The original_question of this Query.
        :type original_question: str
        """

        self._original_question = original_question

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

        Restatement of the question as understood by the translator  # noqa: E501

        :return: The restated_question of this Query.
        :rtype: str
        """
        return self._restated_question

    @restated_question.setter
    def restated_question(self, restated_question: str):
        """Sets the restated_question of this Query.

        Restatement of the question as understood by the translator  # noqa: E501

        :param restated_question: The restated_question of this Query.
        :type restated_question: str
        """

        self._restated_question = restated_question

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

        Response from the translation engine to the user  # noqa: E501

        :return: The message of this Query.
        :rtype: str
        """
        return self._message

    @message.setter
    def message(self, message: str):
        """Sets the message of this Query.

        Response from the translation engine to the user  # noqa: E501

        :param message: The message of this Query.
        :type message: str
        """

        self._message = message

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

        DEPRECATED in favor of query_type_id  # noqa: E501

        :return: The known_query_type_id of this Query.
        :rtype: str
        """
        return self._known_query_type_id

    @known_query_type_id.setter
    def known_query_type_id(self, known_query_type_id: str):
        """Sets the known_query_type_id of this Query.

        DEPRECATED in favor of query_type_id  # noqa: E501

        :param known_query_type_id: The known_query_type_id of this Query.
        :type known_query_type_id: str
        """

        self._known_query_type_id = known_query_type_id

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

        Identifier for the specific query type  # noqa: E501

        :return: The query_type_id of this Query.
        :rtype: str
        """
        return self._query_type_id

    @query_type_id.setter
    def query_type_id(self, query_type_id: str):
        """Sets the query_type_id of this Query.

        Identifier for the specific query type  # noqa: E501

        :param query_type_id: The query_type_id of this Query.
        :type query_type_id: str
        """

        self._query_type_id = query_type_id

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

        Set to true in order to bypass any possible cached response and try to answer the query over again  # noqa: E501

        :return: The bypass_cache of this Query.
        :rtype: str
        """
        return self._bypass_cache

    @bypass_cache.setter
    def bypass_cache(self, bypass_cache: str):
        """Sets the bypass_cache of this Query.

        Set to true in order to bypass any possible cached response and try to answer the query over again  # noqa: E501

        :param bypass_cache: The bypass_cache of this Query.
        :type bypass_cache: str
        """

        self._bypass_cache = bypass_cache

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

        Set to true in order to receive an incomplete response_id if the query will take a while. Client can then periodically request that response_id for a status update and eventual complete response  # noqa: E501

        :return: The asynchronous of this Query.
        :rtype: str
        """
        return self._asynchronous

    @asynchronous.setter
    def asynchronous(self, asynchronous: str):
        """Sets the asynchronous of this Query.

        Set to true in order to receive an incomplete response_id if the query will take a while. Client can then periodically request that response_id for a status update and eventual complete response  # noqa: E501

        :param asynchronous: The asynchronous of this Query.
        :type asynchronous: str
        """

        self._asynchronous = asynchronous

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

        A string of options that can be sent with the query. Options are tool specific and not stipulated here  # noqa: E501

        :return: The options of this Query.
        :rtype: str
        """
        return self._options

    @options.setter
    def options(self, options: str):
        """Sets the options of this Query.

        A string of options that can be sent with the query. Options are tool specific and not stipulated here  # noqa: E501

        :param options: The options of this Query.
        :type options: str
        """

        self._options = options

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

        Maximum number of individual results to return  # noqa: E501

        :return: The max_results of this Query.
        :rtype: int
        """
        return self._max_results

    @max_results.setter
    def max_results(self, max_results: int):
        """Sets the max_results of this Query.

        Maximum number of individual results to return  # noqa: E501

        :param max_results: The max_results of this Query.
        :type max_results: int
        """

        self._max_results = max_results

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

        Split the results into pages with this number of results each  # noqa: E501

        :return: The page_size of this Query.
        :rtype: int
        """
        return self._page_size

    @page_size.setter
    def page_size(self, page_size: int):
        """Sets the page_size of this Query.

        Split the results into pages with this number of results each  # noqa: E501

        :param page_size: The page_size of this Query.
        :type page_size: int
        """

        self._page_size = page_size

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

        Page number of results when the number of results exceeds the page_size  # noqa: E501

        :return: The page_number of this Query.
        :rtype: int
        """
        return self._page_number

    @page_number.setter
    def page_number(self, page_number: int):
        """Sets the page_number of this Query.

        Page number of results when the number of results exceeds the page_size  # noqa: E501

        :param page_number: The page_number of this Query.
        :type page_number: int
        """

        self._page_number = page_number

    @property
    def terms(self) -> QueryTerms:
        """Gets the terms of this Query.


        :return: The terms of this Query.
        :rtype: QueryTerms
        """
        return self._terms

    @terms.setter
    def terms(self, terms: QueryTerms):
        """Sets the terms of this Query.


        :param terms: The terms of this Query.
        :type terms: QueryTerms
        """

        self._terms = terms

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

        List of reasoners to consult for the query  # noqa: E501

        :return: The reasoner_ids of this Query.
        :rtype: List[str]
        """
        return self._reasoner_ids

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

        List of reasoners to consult for the query  # noqa: E501

        :param reasoner_ids: The reasoner_ids of this Query.
        :type reasoner_ids: List[str]
        """

        self._reasoner_ids = reasoner_ids

    @property
    def query_plan(self) -> List[object]:
        """Gets the query_plan of this Query.

        List of node types and edge types in a series that constitute a query plan. Experimental.  # noqa: E501

        :return: The query_plan of this Query.
        :rtype: List[object]
        """
        return self._query_plan

    @query_plan.setter
    def query_plan(self, query_plan: List[object]):
        """Sets the query_plan of this Query.

        List of node types and edge types in a series that constitute a query plan. Experimental.  # noqa: E501

        :param query_plan: The query_plan of this Query.
        :type query_plan: List[object]
        """

        self._query_plan = query_plan
