# This file was auto-generated by Fern from our API Definition.

from __future__ import annotations
from ...core.pydantic_utilities import UniversalBaseModel
import typing
from .transaction_failure_reason import TransactionFailureReason
import pydantic
from .transaction_id import TransactionId
from .transaction_status import TransactionStatus
import datetime as dt
from ...core.pydantic_utilities import IS_PYDANTIC_V2


class TransactionResponseWithoutInvoices_BankAccountToBankAccount(UniversalBaseModel):
    """
    Examples
    --------
    import datetime

    from mercoa.transaction import (
        TransactionResponseWithoutInvoices_BankAccountToBankAccount,
    )

    TransactionResponseWithoutInvoices_BankAccountToBankAccount(
        id="trx_bb08e72f-19f8-45f3-bcf9-46fdc46cb2f4",
        status="PENDING",
        created_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
        updated_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
    )
    """

    type: typing.Literal["bankAccountToBankAccount"] = "bankAccountToBankAccount"
    failure_reason: typing.Optional[TransactionFailureReason] = pydantic.Field(alias="failureReason", default=None)
    id: TransactionId
    status: TransactionStatus
    created_at: dt.datetime = pydantic.Field(alias="createdAt")
    updated_at: dt.datetime = pydantic.Field(alias="updatedAt")

    if IS_PYDANTIC_V2:
        model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True)  # type: ignore # Pydantic v2
    else:

        class Config:
            frozen = True
            smart_union = True
            extra = pydantic.Extra.allow


class TransactionResponseWithoutInvoices_BankAccountToMailedCheck(UniversalBaseModel):
    """
    Examples
    --------
    import datetime

    from mercoa.transaction import (
        TransactionResponseWithoutInvoices_BankAccountToBankAccount,
    )

    TransactionResponseWithoutInvoices_BankAccountToBankAccount(
        id="trx_bb08e72f-19f8-45f3-bcf9-46fdc46cb2f4",
        status="PENDING",
        created_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
        updated_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
    )
    """

    type: typing.Literal["bankAccountToMailedCheck"] = "bankAccountToMailedCheck"
    check_number: int = pydantic.Field(alias="checkNumber")
    id: TransactionId
    status: TransactionStatus
    created_at: dt.datetime = pydantic.Field(alias="createdAt")
    updated_at: dt.datetime = pydantic.Field(alias="updatedAt")

    if IS_PYDANTIC_V2:
        model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True)  # type: ignore # Pydantic v2
    else:

        class Config:
            frozen = True
            smart_union = True
            extra = pydantic.Extra.allow


class TransactionResponseWithoutInvoices_Custom(UniversalBaseModel):
    """
    Examples
    --------
    import datetime

    from mercoa.transaction import (
        TransactionResponseWithoutInvoices_BankAccountToBankAccount,
    )

    TransactionResponseWithoutInvoices_BankAccountToBankAccount(
        id="trx_bb08e72f-19f8-45f3-bcf9-46fdc46cb2f4",
        status="PENDING",
        created_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
        updated_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
    )
    """

    type: typing.Literal["custom"] = "custom"
    id: TransactionId
    status: TransactionStatus
    created_at: dt.datetime = pydantic.Field(alias="createdAt")
    updated_at: dt.datetime = pydantic.Field(alias="updatedAt")

    if IS_PYDANTIC_V2:
        model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True)  # type: ignore # Pydantic v2
    else:

        class Config:
            frozen = True
            smart_union = True
            extra = pydantic.Extra.allow


class TransactionResponseWithoutInvoices_OffPlatform(UniversalBaseModel):
    """
    Examples
    --------
    import datetime

    from mercoa.transaction import (
        TransactionResponseWithoutInvoices_BankAccountToBankAccount,
    )

    TransactionResponseWithoutInvoices_BankAccountToBankAccount(
        id="trx_bb08e72f-19f8-45f3-bcf9-46fdc46cb2f4",
        status="PENDING",
        created_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
        updated_at=datetime.datetime.fromisoformat(
            "2024-01-01 00:00:00+00:00",
        ),
    )
    """

    type: typing.Literal["offPlatform"] = "offPlatform"
    id: TransactionId
    status: TransactionStatus
    created_at: dt.datetime = pydantic.Field(alias="createdAt")
    updated_at: dt.datetime = pydantic.Field(alias="updatedAt")

    if IS_PYDANTIC_V2:
        model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True)  # type: ignore # Pydantic v2
    else:

        class Config:
            frozen = True
            smart_union = True
            extra = pydantic.Extra.allow


"""
import datetime

from mercoa.transaction import (
    TransactionResponseWithoutInvoices_BankAccountToBankAccount,
)

TransactionResponseWithoutInvoices_BankAccountToBankAccount(
    id="trx_bb08e72f-19f8-45f3-bcf9-46fdc46cb2f4",
    status="PENDING",
    created_at=datetime.datetime.fromisoformat(
        "2024-01-01 00:00:00+00:00",
    ),
    updated_at=datetime.datetime.fromisoformat(
        "2024-01-01 00:00:00+00:00",
    ),
)
"""
TransactionResponseWithoutInvoices = typing.Union[
    TransactionResponseWithoutInvoices_BankAccountToBankAccount,
    TransactionResponseWithoutInvoices_BankAccountToMailedCheck,
    TransactionResponseWithoutInvoices_Custom,
    TransactionResponseWithoutInvoices_OffPlatform,
]
