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

"""
pqapiv2

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

from pqapiv2.api_helper import APIHelper
from pqapiv2.configuration import Server
from pqapiv2.controllers.base_controller import BaseController
from pqapiv2.models.transfer_response import TransferResponse
from pqapiv2.models.transfer_collection_response import TransferCollectionResponse


class TransfersController(BaseController):

    """A Controller to access Endpoints in the pqapiv2 API."""
    def __init__(self, config):
        super(TransfersController, self).__init__(config)

    def retrieve_transfer(self,
                          xfer_token,
                          x_my_pay_quicker_version,
                          page=None,
                          page_size=20,
                          filter=None,
                          sort=None,
                          language=None):
        """Does a GET request to /transfers/{xfer-token}.

        Retrieve details of a specific transfer represented by a transfer
        token.

        Args:
            xfer_token (string): Auto-generated unique identifier representing
                an individual transfer transaction, prefixed with
                <i>xfer-</i>.
            x_my_pay_quicker_version (string): Date-based API Version
                specified in the header <i>required</i> on all calls.
            page (int, optional): Page number of specific page to return
            page_size (int, optional): Number of items to be displayed per
                page
            filter (string, optional): Filter request results by specific
                criteria.
            sort (string, optional): Sort request results by specific
                attribute.
            language (LanguageTypesEnum, optional): Filter results by language
                type.

        Returns:
            TransferResponse: Response from the API. OK

        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 = '/transfers/{xfer-token}'
        _url_path = APIHelper.append_url_with_template_parameters(_url_path, {
            'xfer-token': {'value': xfer_token, 'encode': True}
        })
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_parameters = {
            'page': page,
            'pageSize': page_size,
            'filter': filter,
            'sort': sort,
            'language': language
        }
        _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',
            'X-MyPayQuicker-Version': x_my_pay_quicker_version
        }

        # 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, TransferResponse.from_dictionary)

        return decoded

    def accept_transfer_quote(self,
                              xfer_token,
                              x_my_pay_quicker_version):
        """Does a POST request to /transfers/{xfer-token}.

        Accept a transfer quote

        Args:
            xfer_token (string): Auto-generated unique identifier representing
                an individual transfer transaction, prefixed with
                <i>xfer-</i>.
            x_my_pay_quicker_version (string): Date-based API Version
                specified in the header <i>required</i> on all calls.

        Returns:
            void: Response from the API. OK

        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 = '/transfers/{xfer-token}'
        _url_path = APIHelper.append_url_with_template_parameters(_url_path, {
            'xfer-token': {'value': xfer_token, 'encode': True}
        })
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'X-MyPayQuicker-Version': x_my_pay_quicker_version
        }

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

    def cancel_transfer_quote(self,
                              xfer_token,
                              x_my_pay_quicker_version):
        """Does a DELETE request to /transfers/{xfer-token}.

        Optional cancellation that auto-cancels after a period organically
        expires or when account activity invalidates the quote.

        Args:
            xfer_token (string): Auto-generated unique identifier representing
                an individual transfer transaction, prefixed with
                <i>xfer-</i>.
            x_my_pay_quicker_version (string): Date-based API Version
                specified in the header <i>required</i> on all calls.

        Returns:
            void: Response from the API. OK

        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 = '/transfers/{xfer-token}'
        _url_path = APIHelper.append_url_with_template_parameters(_url_path, {
            'xfer-token': {'value': xfer_token, 'encode': True}
        })
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'X-MyPayQuicker-Version': x_my_pay_quicker_version
        }

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

    def list_transfers(self,
                       x_my_pay_quicker_version,
                       page=None,
                       page_size=20,
                       filter=None,
                       sort=None,
                       language=None):
        """Does a GET request to /transfers.

        Retrieve a list of all transfers that supports filtering, sorting, and
        pagination through existing mechanisms.

        Args:
            x_my_pay_quicker_version (string): Date-based API Version
                specified in the header <i>required</i> on all calls.
            page (int, optional): Page number of specific page to return
            page_size (int, optional): Number of items to be displayed per
                page
            filter (string, optional): Filter request results by specific
                criteria.
            sort (string, optional): Sort request results by specific
                attribute.
            language (LanguageTypesEnum, optional): Filter results by language
                type.

        Returns:
            TransferCollectionResponse: 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 = '/transfers'
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_parameters = {
            'page': page,
            'pageSize': page_size,
            'filter': filter,
            'sort': sort,
            'language': language
        }
        _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',
            'X-MyPayQuicker-Version': x_my_pay_quicker_version
        }

        # 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, TransferCollectionResponse.from_dictionary)

        return decoded

    def quote_transfer(self,
                       x_my_pay_quicker_version,
                       body):
        """Does a POST request to /transfers.

        Create a new quote. <i>*This can be a non-payment card-to-card
        transfer, prepaid card from Flex (wallet), bank account, or
        user-to-user transfer.</i>

        Args:
            x_my_pay_quicker_version (string): Date-based API Version
                specified in the header <i>required</i> on all calls.
            body (TransferRequest): TODO: type description here.

        Returns:
            TransferResponse: 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 = '/transfers'
        _query_builder = self.config.get_base_uri()
        _query_builder += _url_path
        _query_url = APIHelper.clean_url(_query_builder)

        # Prepare headers
        _headers = {
            'accept': 'application/json',
            'X-MyPayQuicker-Version': x_my_pay_quicker_version,
            'Content-Type': 'application/json'
        }

        # 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, TransferResponse.from_dictionary)

        return decoded
