# -*- coding: utf-8 -*-
# File generated from our OpenAPI spec
from stripe._list_object import ListObject
from stripe._request_options import RequestOptions
from stripe._stripe_service import StripeService
from stripe._util import sanitize_id
from stripe.terminal._reader import Reader
from typing import Optional, cast
from typing_extensions import TYPE_CHECKING

if TYPE_CHECKING:
    from stripe.params.terminal._reader_cancel_action_params import (
        ReaderCancelActionParams,
    )
    from stripe.params.terminal._reader_collect_inputs_params import (
        ReaderCollectInputsParams,
    )
    from stripe.params.terminal._reader_collect_payment_method_params import (
        ReaderCollectPaymentMethodParams,
    )
    from stripe.params.terminal._reader_confirm_payment_intent_params import (
        ReaderConfirmPaymentIntentParams,
    )
    from stripe.params.terminal._reader_create_params import ReaderCreateParams
    from stripe.params.terminal._reader_delete_params import ReaderDeleteParams
    from stripe.params.terminal._reader_list_params import ReaderListParams
    from stripe.params.terminal._reader_process_payment_intent_params import (
        ReaderProcessPaymentIntentParams,
    )
    from stripe.params.terminal._reader_process_setup_intent_params import (
        ReaderProcessSetupIntentParams,
    )
    from stripe.params.terminal._reader_refund_payment_params import (
        ReaderRefundPaymentParams,
    )
    from stripe.params.terminal._reader_retrieve_params import (
        ReaderRetrieveParams,
    )
    from stripe.params.terminal._reader_set_reader_display_params import (
        ReaderSetReaderDisplayParams,
    )
    from stripe.params.terminal._reader_update_params import ReaderUpdateParams


class ReaderService(StripeService):
    def delete(
        self,
        reader: str,
        params: Optional["ReaderDeleteParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Deletes a Reader object.
        """
        return cast(
            Reader,
            self._request(
                "delete",
                "/v1/terminal/readers/{reader}".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def delete_async(
        self,
        reader: str,
        params: Optional["ReaderDeleteParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Deletes a Reader object.
        """
        return cast(
            Reader,
            await self._request_async(
                "delete",
                "/v1/terminal/readers/{reader}".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def retrieve(
        self,
        reader: str,
        params: Optional["ReaderRetrieveParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Retrieves a Reader object.
        """
        return cast(
            Reader,
            self._request(
                "get",
                "/v1/terminal/readers/{reader}".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def retrieve_async(
        self,
        reader: str,
        params: Optional["ReaderRetrieveParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Retrieves a Reader object.
        """
        return cast(
            Reader,
            await self._request_async(
                "get",
                "/v1/terminal/readers/{reader}".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def update(
        self,
        reader: str,
        params: Optional["ReaderUpdateParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Updates a Reader object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def update_async(
        self,
        reader: str,
        params: Optional["ReaderUpdateParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Updates a Reader object by setting the values of the parameters passed. Any parameters not provided will be left unchanged.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def list(
        self,
        params: Optional["ReaderListParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> ListObject[Reader]:
        """
        Returns a list of Reader objects.
        """
        return cast(
            ListObject[Reader],
            self._request(
                "get",
                "/v1/terminal/readers",
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def list_async(
        self,
        params: Optional["ReaderListParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> ListObject[Reader]:
        """
        Returns a list of Reader objects.
        """
        return cast(
            ListObject[Reader],
            await self._request_async(
                "get",
                "/v1/terminal/readers",
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def create(
        self,
        params: "ReaderCreateParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Creates a new Reader object.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers",
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def create_async(
        self,
        params: "ReaderCreateParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Creates a new Reader object.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers",
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def cancel_action(
        self,
        reader: str,
        params: Optional["ReaderCancelActionParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Cancels the current reader action.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/cancel_action".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def cancel_action_async(
        self,
        reader: str,
        params: Optional["ReaderCancelActionParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Cancels the current reader action.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/cancel_action".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def collect_inputs(
        self,
        reader: str,
        params: "ReaderCollectInputsParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates an input collection flow on a Reader.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/collect_inputs".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def collect_inputs_async(
        self,
        reader: str,
        params: "ReaderCollectInputsParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates an input collection flow on a Reader.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/collect_inputs".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def collect_payment_method(
        self,
        reader: str,
        params: "ReaderCollectPaymentMethodParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a payment flow on a Reader and updates the PaymentIntent with card details before manual confirmation.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/collect_payment_method".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def collect_payment_method_async(
        self,
        reader: str,
        params: "ReaderCollectPaymentMethodParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a payment flow on a Reader and updates the PaymentIntent with card details before manual confirmation.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/collect_payment_method".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def confirm_payment_intent(
        self,
        reader: str,
        params: "ReaderConfirmPaymentIntentParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Finalizes a payment on a Reader.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/confirm_payment_intent".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def confirm_payment_intent_async(
        self,
        reader: str,
        params: "ReaderConfirmPaymentIntentParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Finalizes a payment on a Reader.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/confirm_payment_intent".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def process_payment_intent(
        self,
        reader: str,
        params: "ReaderProcessPaymentIntentParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a payment flow on a Reader.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/process_payment_intent".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def process_payment_intent_async(
        self,
        reader: str,
        params: "ReaderProcessPaymentIntentParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a payment flow on a Reader.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/process_payment_intent".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def process_setup_intent(
        self,
        reader: str,
        params: "ReaderProcessSetupIntentParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a setup intent flow on a Reader.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/process_setup_intent".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def process_setup_intent_async(
        self,
        reader: str,
        params: "ReaderProcessSetupIntentParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a setup intent flow on a Reader.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/process_setup_intent".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def refund_payment(
        self,
        reader: str,
        params: Optional["ReaderRefundPaymentParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a refund on a Reader
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/refund_payment".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def refund_payment_async(
        self,
        reader: str,
        params: Optional["ReaderRefundPaymentParams"] = None,
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Initiates a refund on a Reader
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/refund_payment".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    def set_reader_display(
        self,
        reader: str,
        params: "ReaderSetReaderDisplayParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Sets reader display to show cart details.
        """
        return cast(
            Reader,
            self._request(
                "post",
                "/v1/terminal/readers/{reader}/set_reader_display".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )

    async def set_reader_display_async(
        self,
        reader: str,
        params: "ReaderSetReaderDisplayParams",
        options: Optional[RequestOptions] = None,
    ) -> Reader:
        """
        Sets reader display to show cart details.
        """
        return cast(
            Reader,
            await self._request_async(
                "post",
                "/v1/terminal/readers/{reader}/set_reader_display".format(
                    reader=sanitize_id(reader),
                ),
                base_address="api",
                params=params,
                options=options,
            ),
        )
