# -*- coding: utf-8 -*-

"""
zypev1

This file was automatically generated by APIMATIC v3.0 (
 https://www.apimatic.io ).
"""

from zypev1.api_helper import APIHelper
from zypev1.configuration import Server
from zypev1.controllers.base_controller import BaseController
from zypev1.models.consumer_metadata import ConsumerMetadata


class ConsumersController(BaseController):

    """A Controller to access Endpoints in the zypev1 API."""

    def __init__(self, config, call_back=None):
        super(ConsumersController, self).__init__(config, call_back)

    def consumers_get(self,
                      braintree_id=None,
                      stripe_id=None,
                      email=None,
                      password_token=None,
                      rss_token=None,
                      id=None,
                      created_at=None,
                      q=None,
                      order=None,
                      sort=None,
                      page=None,
                      per_page=None):
        """Does a GET request to /consumers.

        List Consumers

        Args:
            braintree_id (string, optional): Filter by the consumer's
                Braintree ID
            stripe_id (string, optional): Filter by the consumer's Stripe ID
            email (string, optional): Filter by the consumer's email
            password_token (string, optional): Filter by the consumer's
                password token
            rss_token (string, optional): Filter by the consumer's RSS token
            id (string, optional): Filter by id + Examples     +
                `id=5992f328ce593000ef000008`     + use
                `id!=5992f328ce593000ef000008` to exclude by id
            created_at (string, optional): Filter by when consumer was
                created
            q (string, optional): Filter by keyword
            order (string, optional): Filter by ascending or descending order
                + Examples     + `asc`     + `desc`
            sort (string, optional): Sort on the specified field
            page (float, optional): Number of pages to return
            per_page (float, optional): Number of records to return per page

        Returns:
            list of ConsumerMetadata: Response from the API.

        Raises:
            APIException: When an error occurs while fetching the data from
                the remote API. This exception includes the HTTP Response
                code, an error message, and the HTTP body that was received in
                the request.

        """

        # Prepare query URL
        _url_path = '/consumers'
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_parameters = {
            'braintree_id': braintree_id,
            'stripe_id': stripe_id,
            'email': email,
            'password_token': password_token,
            'rss_token': rss_token,
            'id': id,
            'created_at': created_at,
            'q': q,
            'order': order,
            'sort': sort,
            'page': page,
            'per_page': per_page
        }
        _query_builder = APIHelper.append_url_with_query_parameters(
            _query_builder,
            _query_parameters
        )
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'accept': 'application/json'
        }

        # Prepare and execute request
        _request = self.config.http_client.get(_query_url, headers=_headers)
        _response = self.execute_request(_request)
        self.validate_response(_response)

        decoded = APIHelper.json_deserialize(_response.text, ConsumerMetadata.from_dictionary)

        return decoded

    def consumers_post(self,
                       body,
                       braintree_id=None,
                       stripe_id=None,
                       created_at=None,
                       email=None,
                       id=None,
                       password_token=None,
                       rss_token=None,
                       page=None,
                       per_page=None,
                       order=None,
                       sort=None,
                       q=None):
        """Does a POST request to /consumers.

        Create Consumers

        Args:
            body (ConsumerRequest): TODO: type description here.
            braintree_id (string, optional): TODO: type description here.
            stripe_id (string, optional): TODO: type description here.
            created_at (string, optional): TODO: type description here.
            email (string, optional): TODO: type description here.
            id (string, optional): TODO: type description here.
            password_token (string, optional): TODO: type description here.
            rss_token (string, optional): TODO: type description here.
            page (string, optional): TODO: type description here.
            per_page (string, optional): TODO: type description here.
            order (string, optional): TODO: type description here.
            sort (string, optional): TODO: type description here.
            q (string, optional): TODO: type description here.

        Returns:
            ConsumerMetadata: Response from the API.

        Raises:
            APIException: When an error occurs while fetching the data from
                the remote API. This exception includes the HTTP Response
                code, an error message, and the HTTP body that was received in
                the request.

        """

        # Prepare query URL
        _url_path = '/consumers'
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_parameters = {
            'braintree_id': braintree_id,
            'stripe_id': stripe_id,
            'created_at': created_at,
            'email': email,
            'id': id,
            'password_token': password_token,
            'rss_token': rss_token,
            'page': page,
            'per_page': per_page,
            'order': order,
            'sort': sort,
            'q': q
        }
        _query_builder = APIHelper.append_url_with_query_parameters(
            _query_builder,
            _query_parameters
        )
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'accept': 'application/json',
            'content-type': 'application/json; charset=utf-8'
        }

        # Prepare and execute request
        _request = self.config.http_client.post(_query_url, headers=_headers, parameters=APIHelper.json_serialize(body))
        _response = self.execute_request(_request)
        self.validate_response(_response)

        decoded = APIHelper.json_deserialize(_response.text, ConsumerMetadata.from_dictionary)

        return decoded

    def consumers_by_id_get(self,
                            id):
        """Does a GET request to /consumers/{id}.

        View Consumer

        Args:
            id (string): Consumer ID

        Returns:
            ConsumerMetadata: Response from the API.

        Raises:
            APIException: When an error occurs while fetching the data from
                the remote API. This exception includes the HTTP Response
                code, an error message, and the HTTP body that was received in
                the request.

        """

        # Prepare query URL
        _url_path = '/consumers/{id}'
        _url_path = APIHelper.append_url_with_template_parameters(_url_path, {
            'id': {'value': id, 'encode': True}
        })
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'accept': 'application/json'
        }

        # Prepare and execute request
        _request = self.config.http_client.get(_query_url, headers=_headers)
        _response = self.execute_request(_request)
        self.validate_response(_response)

        decoded = APIHelper.json_deserialize(_response.text, ConsumerMetadata.from_dictionary)

        return decoded

    def consumers_by_id_put(self,
                            id,
                            body):
        """Does a PUT request to /consumers/{id}.

        Update Consumer

        Args:
            id (string): Consumer ID
            body (ConsumerRequest): TODO: type description here.

        Returns:
            ConsumerMetadata: Response from the API.

        Raises:
            APIException: When an error occurs while fetching the data from
                the remote API. This exception includes the HTTP Response
                code, an error message, and the HTTP body that was received in
                the request.

        """

        # Prepare query URL
        _url_path = '/consumers/{id}'
        _url_path = APIHelper.append_url_with_template_parameters(_url_path, {
            'id': {'value': id, 'encode': True}
        })
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'accept': 'application/json',
            'content-type': 'application/json; charset=utf-8'
        }

        # Prepare and execute request
        _request = self.config.http_client.put(_query_url, headers=_headers, parameters=APIHelper.json_serialize(body))
        _response = self.execute_request(_request)
        self.validate_response(_response)

        decoded = APIHelper.json_deserialize(_response.text, ConsumerMetadata.from_dictionary)

        return decoded

    def consumers_by_id_delete(self,
                               id):
        """Does a DELETE request to /consumers/{id}.

        Delete Video Consumer

        Args:
            id (string): Consumer ID

        Returns:
            void: Response from the API.

        Raises:
            APIException: When an error occurs while fetching the data from
                the remote API. This exception includes the HTTP Response
                code, an error message, and the HTTP body that was received in
                the request.

        """

        # Prepare query URL
        _url_path = '/consumers/{id}'
        _url_path = APIHelper.append_url_with_template_parameters(_url_path, {
            'id': {'value': id, 'encode': True}
        })
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare and execute request
        _request = self.config.http_client.delete(_query_url)
        _response = self.execute_request(_request)
        self.validate_response(_response)
