"""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_create_order_post_400_response_1_exception import (  # noqa: E501
    PtsV2CreateOrderPost400Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_create_order_post_502_response_1_exception import (  # noqa: E501
    PtsV2CreateOrderPost502Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_update_order_patch_400_response_1_exception import (  # noqa: E501
    PtsV2UpdateOrderPatch400Response1Exception,
)
from visaacceptancemergedspec.exceptions.pts_v_2_update_order_patch_502_response_1_exception import (  # noqa: E501
    PtsV2UpdateOrderPatch502Response1Exception,
)
from visaacceptancemergedspec.http.http_method_enum import (
    HttpMethodEnum,
)
from visaacceptancemergedspec.models.pts_v_2_create_order_post_201_response import (
    PtsV2CreateOrderPost201Response,
)
from visaacceptancemergedspec.models.pts_v_2_update_order_patch_201_response import (
    PtsV2UpdateOrderPatch201Response,
)


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

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

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

        A create order request enables you to send the itemized details along with
        the order. This API can be used by merchants initiating their transactions
        with the create order API.

        Args:
            body (CreateOrderRequest): 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/intents")
            .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(PtsV2CreateOrderPost201Response.from_dictionary)
            .is_api_response(True)
            .local_error("400",
                "Invalid request.",
                PtsV2CreateOrderPost400Response1Exception)
            .local_error("502",
                "Unexpected system error or system timeout.",
                PtsV2CreateOrderPost502Response1Exception),
        ).execute()

    def update_order(self,
                     id,
                     body):
        """Perform a PATCH request to /pts/v2/intents/{id}.

        This API can be used in two flavours - for updating the order as well as
        saving the order.

        Args:
            id (str): The ID returned from the original create order response.
            body (UpdateOrderRequest): 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/intents/{id}")
            .http_method(HttpMethodEnum.PATCH)
            .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(PtsV2UpdateOrderPatch201Response.from_dictionary)
            .is_api_response(True)
            .local_error("400",
                "Invalid request.",
                PtsV2UpdateOrderPatch400Response1Exception)
            .local_error("502",
                "Unexpected system error or system timeout.",
                PtsV2UpdateOrderPatch502Response1Exception),
        ).execute()
