"""visaacceptancemergedspec.

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

# ruff: noqa: D410, E501, E101, D206
from apimatic_core.authentication.multiple.and_auth_group import (
    And,
)
from apimatic_core.authentication.multiple.single_auth import (
    Single,
)
from apimatic_core.request_builder import RequestBuilder
from apimatic_core.response_handler import ResponseHandler
from apimatic_core.types.parameter import Parameter

from visaacceptancemergedspec.api_helper import (
    APIHelper,
)
from visaacceptancemergedspec.apis.base_api import (
    BaseApi,
)
from visaacceptancemergedspec.configuration import (
    Server,
)
from visaacceptancemergedspec.exceptions.pts_v_2_payments_reversals_post_400_response_1_exception import (  # noqa: E501
    PtsV2PaymentsReversalsPost400Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_payments_reversals_post_502_response_1_exception import (  # noqa: E501
    PtsV2PaymentsReversalsPost502Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_reversals_post_400_response_1_exception import (  # noqa: E501
    PtsV2ReversalsPost400Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_reversals_post_502_response_1_exception import (  # noqa: E501
    PtsV2ReversalsPost502Response1Exception,
)
from visaacceptancemergedspec.http.http_method_enum import (
    HttpMethodEnum,
)
from visaacceptancemergedspec.models.pts_v_2_payments_reversals_post_201_response import (  # noqa: E501
    PtsV2PaymentsReversalsPost201Response,
)
from visaacceptancemergedspec.models.pts_v_2_reversals_post_201_response import (
    PtsV2ReversalsPost201Response,
)


class ReversalApi(BaseApi):
    """A Controller to access Endpoints in the visaacceptancemergedspec API."""

    def __init__(self, config):
        """Initialize ReversalApi object."""
        super(ReversalApi, self).__init__(config)

    def auth_reversal(self,
                      id,
                      body):
        """Perform a POST request to /pts/v2/payments/{id}/reversals.

        Include the payment ID in the POST request to reverse the payment amount.

        Args:
            id (str): The payment ID returned from a previous payment request.
            body (AuthReversalRequest): The request body parameter.

        Returns:
            ApiResponse: An object with the response value as well as other useful
                information such as status codes and headers. Successful response.

        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.

        """
        return super().new_api_call_builder.request(
            RequestBuilder().server(Server.DEFAULT)
            .path("/pts/v2/payments/{id}/reversals")
            .http_method(HttpMethodEnum.POST)
            .template_param(Parameter()
                .key("id")
                .value(id)
                .is_required(True)
                .should_encode(True))
            .header_param(Parameter()
                .key("Content-Type")
                .value("application/json"))
            .body_param(Parameter()
                .value(body)
                .is_required(True))
            .header_param(Parameter()
                .key("accept")
                .value("application/json"))
            .body_serializer(APIHelper.json_serialize)
            .auth(And(Single("BearerAuth"), Single("Accept"))),
        ).response(
            ResponseHandler()
            .deserializer(APIHelper.json_deserialize)
            .deserialize_into(PtsV2PaymentsReversalsPost201Response.from_dictionary)
            .is_api_response(True)
            .local_error("400",
                "Invalid request.",
                PtsV2PaymentsReversalsPost400Response1Exception)
            .local_error("502",
                "Unexpected system error or system timeout.",
                PtsV2PaymentsReversalsPost502Response1Exception),
        ).execute()

    def mit_reversal(self,
                     body):
        """Perform a POST request to /pts/v2/reversals.

        This is to reverse a previous payment that merchant does not receive a
        reply(Mostly due to Timeout). To use this feature/API, make sure to pass
        unique value to field - clientReferenceInformation -> transactionId in
        [/pts/v2/payments]( API call and use same transactionId in this API request
        payload to reverse the payment.

        Args:
            body (MitReversalRequest): The request body parameter.

        Returns:
            ApiResponse: An object with the response value as well as other useful
                information such as status codes and headers. Successful response.

        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.

        """
        return super().new_api_call_builder.request(
            RequestBuilder().server(Server.DEFAULT)
            .path("/pts/v2/reversals")
            .http_method(HttpMethodEnum.POST)
            .header_param(Parameter()
                .key("Content-Type")
                .value("application/json"))
            .body_param(Parameter()
                .value(body)
                .is_required(True))
            .header_param(Parameter()
                .key("accept")
                .value("application/json"))
            .body_serializer(APIHelper.json_serialize)
            .auth(And(Single("BearerAuth"), Single("Accept"))),
        ).response(
            ResponseHandler()
            .deserializer(APIHelper.json_deserialize)
            .deserialize_into(PtsV2ReversalsPost201Response.from_dictionary)
            .is_api_response(True)
            .local_error("400",
                "Invalid request.",
                PtsV2ReversalsPost400Response1Exception)
            .local_error("502",
                "Unexpected system error or system timeout.",
                PtsV2ReversalsPost502Response1Exception),
        ).execute()
