"""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_captures_refunds_post_400_response_1_exception import (  # noqa: E501
    PtsV2CapturesRefundsPost400Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_captures_refunds_post_502_response_1_exception import (  # noqa: E501
    PtsV2CapturesRefundsPost502Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_payments_refund_post_400_response_1_exception import (  # noqa: E501
    PtsV2PaymentsRefundPost400Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_payments_refund_post_502_response_1_exception import (  # noqa: E501
    PtsV2PaymentsRefundPost502Response1Exception,
)
from visaacceptancemergedspec.http.http_method_enum import (
    HttpMethodEnum,
)
from visaacceptancemergedspec.models.pts_v_2_captures_refunds_post_201_response import (
    PtsV2CapturesRefundsPost201Response,
)
from visaacceptancemergedspec.models.pts_v_2_payments_refund_post_201_response import (
    PtsV2PaymentsRefundPost201Response,
)


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

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

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

        Refund a Payment API is only used, if you have requested Authorization and
        Capture together in [/pts/v2/payments]( API call. Include the payment ID in
        the POST request to refund the payment amount.

        Args:
            id (str): The payment ID. This ID is returned from a previous payment
                request.
            body (RefundPaymentRequest): 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}/refunds")
            .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(PtsV2PaymentsRefundPost201Response.from_dictionary)
            .is_api_response(True)
            .local_error("400",
                "Invalid request.",
                PtsV2PaymentsRefundPost400Response1Exception)
            .local_error("502",
                "Unexpected system error or system timeout.",
                PtsV2PaymentsRefundPost502Response1Exception),
        ).execute()

    def refund_capture(self,
                       id,
                       body):
        """Perform a POST request to /pts/v2/captures/{id}/refunds.

        Refund a capture API is only used, if you have requested Capture
        independenlty using [/pts/v2/payments/{id}/captures]( API call. Include the
        capture ID in the POST request to refund the captured amount.

        Args:
            id (str): The capture ID. This ID is returned from a previous capture
                request.
            body (RefundPaymentRequest): 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/captures/{id}/refunds")
            .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(PtsV2CapturesRefundsPost201Response.from_dictionary)
            .is_api_response(True)
            .local_error("400",
                "Invalid request.",
                PtsV2CapturesRefundsPost400Response1Exception)
            .local_error("502",
                "Unexpected system error or system timeout.",
                PtsV2CapturesRefundsPost502Response1Exception),
        ).execute()
