# -*- coding: utf-8 -*-
# File generated from our OpenAPI spec
from stripe._api_resource import APIResource
from stripe._stripe_object import StripeObject
from typing import ClassVar, List, Optional, Union, cast
from typing_extensions import Literal, Unpack, TYPE_CHECKING

if TYPE_CHECKING:
    from stripe.params.tax._association_find_params import (
        AssociationFindParams,
    )


class Association(APIResource["Association"]):
    """
    A Tax Association exposes the Tax Transactions that Stripe attempted to create on your behalf based on the PaymentIntent input
    """

    OBJECT_NAME: ClassVar[Literal["tax.association"]] = "tax.association"

    class TaxTransactionAttempt(StripeObject):
        class Committed(StripeObject):
            transaction: str
            """
            The [Tax Transaction](https://docs.stripe.com/api/tax/transaction/object)
            """

        class Errored(StripeObject):
            reason: Union[
                Literal[
                    "another_payment_associated_with_calculation",
                    "calculation_expired",
                    "currency_mismatch",
                    "original_transaction_voided",
                    "unique_reference_violation",
                ],
                str,
            ]
            """
            Details on why we couldn't commit the tax transaction.
            """

        committed: Optional[Committed]
        errored: Optional[Errored]
        source: str
        """
        The source of the tax transaction attempt. This is either a refund or a payment intent.
        """
        status: str
        """
        The status of the transaction attempt. This can be `errored` or `committed`.
        """
        _inner_class_types = {"committed": Committed, "errored": Errored}

    calculation: str
    """
    The [Tax Calculation](https://docs.stripe.com/api/tax/calculations/object) that was included in PaymentIntent.
    """
    id: str
    """
    Unique identifier for the object.
    """
    object: Literal["tax.association"]
    """
    String representing the object's type. Objects of the same type share the same value.
    """
    payment_intent: str
    """
    The [PaymentIntent](https://docs.stripe.com/api/payment_intents/object) that this Tax Association is tracking.
    """
    tax_transaction_attempts: Optional[List[TaxTransactionAttempt]]
    """
    Information about the tax transactions linked to this payment intent
    """

    @classmethod
    def find(cls, **params: Unpack["AssociationFindParams"]) -> "Association":
        """
        Finds a tax association object by PaymentIntent id.
        """
        return cast(
            "Association",
            cls._static_request(
                "get",
                "/v1/tax/associations/find",
                params=params,
            ),
        )

    @classmethod
    async def find_async(
        cls, **params: Unpack["AssociationFindParams"]
    ) -> "Association":
        """
        Finds a tax association object by PaymentIntent id.
        """
        return cast(
            "Association",
            await cls._static_request_async(
                "get",
                "/v1/tax/associations/find",
                params=params,
            ),
        )

    _inner_class_types = {"tax_transaction_attempts": TaxTransactionAttempt}
