# coding: utf-8

"""
    Synctera API

    <h2>Let's build something great.</h2><p>Welcome to the official reference documentation for Synctera APIs. Our APIs are the best way to automate your company's banking needs and are designed to be easy to understand and implement.</p><p>We're continuously growing this library and what you see here is just the start, but if you need something specific or have a question, <a class='text-blue-600' href='https://synctera.com/contact' target='_blank' rel='noreferrer'>contact us</a>.</p>   # noqa: E501

    The version of the OpenAPI document: 0.36.0
    Generated by: https://openapi-generator.tech
"""

from datetime import date, datetime  # noqa: F401
import decimal  # noqa: F401
import functools  # noqa: F401
import io  # noqa: F401
import re  # noqa: F401
import typing  # noqa: F401
import typing_extensions  # noqa: F401
import uuid  # noqa: F401

import frozendict  # noqa: F401

from synctera_client import schemas  # noqa: F401


class InternalTransfer(
    schemas.DictSchema
):
    """NOTE: This class is auto generated by OpenAPI Generator.
    Ref: https://openapi-generator.tech

    Do not edit the class manually.
    """


    class MetaOapg:
        required = {
            "amount",
            "currency",
            "type",
        }
        
        class properties:
            
            
            class amount(
                schemas.Int64Schema
            ):
            
            
                class MetaOapg:
                    format = 'int64'
                    inclusive_minimum = 1
            currency = schemas.StrSchema
            
            
            class type(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "ACCOUNT_TO_ACCOUNT": "ACCOUNT_TO_ACCOUNT",
                        "ACH_CREDIT_SWEEP": "ACH_CREDIT_SWEEP",
                        "ACH_DEBIT_SWEEP": "ACH_DEBIT_SWEEP",
                        "ACH_FLOAT_TRANSFER": "ACH_FLOAT_TRANSFER",
                        "ACH_SWEEP": "ACH_SWEEP",
                        "CASHBACK": "CASHBACK",
                        "FEE": "FEE",
                        "INCOMING_WIRE": "INCOMING_WIRE",
                        "INTEREST_PAYOUT": "INTEREST_PAYOUT",
                        "LOAN_DISBURSEMENT": "LOAN_DISBURSEMENT",
                        "LOAN_FUNDING": "LOAN_FUNDING",
                        "MANUAL_ADJUSTMENT": "MANUAL_ADJUSTMENT",
                        "MANUAL_ADJUSTMENT_REVERSAL": "MANUAL_ADJUSTMENT_REVERSAL",
                        "MANUAL_CARD_SWEEP": "MANUAL_CARD_SWEEP",
                        "MANUAL_CHECK_SWEEP": "MANUAL_CHECK_SWEEP",
                        "MANUAL_WIRE_SWEEP": "MANUAL_WIRE_SWEEP",
                        "OUTGOING_INTERNATIONAL_REMITTANCE": "OUTGOING_INTERNATIONAL_REMITTANCE",
                        "OUTGOING_INTERNATIONAL_REMITTANCE_REVERSAL": "OUTGOING_INTERNATIONAL_REMITTANCE_REVERSAL",
                        "PROMOTIONAL_CREDIT": "PROMOTIONAL_CREDIT",
                        "PROMOTIONAL_CREDIT_REVERSAL": "PROMOTIONAL_CREDIT_REVERSAL",
                        "SIGN_UP_BONUS": "SIGN_UP_BONUS",
                        "SUBSCRIPTION_FEE": "SUBSCRIPTION_FEE",
                        "TRANSFER_FEE": "TRANSFER_FEE",
                        "TRANSFER_FEE_REVERSAL": "TRANSFER_FEE_REVERSAL",
                        "WIRE_SETTLEMENT_CREDIT": "WIRE_SETTLEMENT_CREDIT",
                        "WIRE_SETTLEMENT_DEBIT": "WIRE_SETTLEMENT_DEBIT",
                        "CARD_PROVISIONAL_CREDIT": "CARD_PROVISIONAL_CREDIT",
                        "CARD_CHARGEBACK": "CARD_CHARGEBACK",
                        "CARD_CHARGEBACK_WRITEOFF": "CARD_CHARGEBACK_WRITEOFF",
                    }
                
                @schemas.classproperty
                def ACCOUNT_TO_ACCOUNT(cls):
                    return cls("ACCOUNT_TO_ACCOUNT")
                
                @schemas.classproperty
                def ACH_CREDIT_SWEEP(cls):
                    return cls("ACH_CREDIT_SWEEP")
                
                @schemas.classproperty
                def ACH_DEBIT_SWEEP(cls):
                    return cls("ACH_DEBIT_SWEEP")
                
                @schemas.classproperty
                def ACH_FLOAT_TRANSFER(cls):
                    return cls("ACH_FLOAT_TRANSFER")
                
                @schemas.classproperty
                def ACH_SWEEP(cls):
                    return cls("ACH_SWEEP")
                
                @schemas.classproperty
                def CASHBACK(cls):
                    return cls("CASHBACK")
                
                @schemas.classproperty
                def FEE(cls):
                    return cls("FEE")
                
                @schemas.classproperty
                def INCOMING_WIRE(cls):
                    return cls("INCOMING_WIRE")
                
                @schemas.classproperty
                def INTEREST_PAYOUT(cls):
                    return cls("INTEREST_PAYOUT")
                
                @schemas.classproperty
                def LOAN_DISBURSEMENT(cls):
                    return cls("LOAN_DISBURSEMENT")
                
                @schemas.classproperty
                def LOAN_FUNDING(cls):
                    return cls("LOAN_FUNDING")
                
                @schemas.classproperty
                def MANUAL_ADJUSTMENT(cls):
                    return cls("MANUAL_ADJUSTMENT")
                
                @schemas.classproperty
                def MANUAL_ADJUSTMENT_REVERSAL(cls):
                    return cls("MANUAL_ADJUSTMENT_REVERSAL")
                
                @schemas.classproperty
                def MANUAL_CARD_SWEEP(cls):
                    return cls("MANUAL_CARD_SWEEP")
                
                @schemas.classproperty
                def MANUAL_CHECK_SWEEP(cls):
                    return cls("MANUAL_CHECK_SWEEP")
                
                @schemas.classproperty
                def MANUAL_WIRE_SWEEP(cls):
                    return cls("MANUAL_WIRE_SWEEP")
                
                @schemas.classproperty
                def OUTGOING_INTERNATIONAL_REMITTANCE(cls):
                    return cls("OUTGOING_INTERNATIONAL_REMITTANCE")
                
                @schemas.classproperty
                def OUTGOING_INTERNATIONAL_REMITTANCE_REVERSAL(cls):
                    return cls("OUTGOING_INTERNATIONAL_REMITTANCE_REVERSAL")
                
                @schemas.classproperty
                def PROMOTIONAL_CREDIT(cls):
                    return cls("PROMOTIONAL_CREDIT")
                
                @schemas.classproperty
                def PROMOTIONAL_CREDIT_REVERSAL(cls):
                    return cls("PROMOTIONAL_CREDIT_REVERSAL")
                
                @schemas.classproperty
                def SIGN_UP_BONUS(cls):
                    return cls("SIGN_UP_BONUS")
                
                @schemas.classproperty
                def SUBSCRIPTION_FEE(cls):
                    return cls("SUBSCRIPTION_FEE")
                
                @schemas.classproperty
                def TRANSFER_FEE(cls):
                    return cls("TRANSFER_FEE")
                
                @schemas.classproperty
                def TRANSFER_FEE_REVERSAL(cls):
                    return cls("TRANSFER_FEE_REVERSAL")
                
                @schemas.classproperty
                def WIRE_SETTLEMENT_CREDIT(cls):
                    return cls("WIRE_SETTLEMENT_CREDIT")
                
                @schemas.classproperty
                def WIRE_SETTLEMENT_DEBIT(cls):
                    return cls("WIRE_SETTLEMENT_DEBIT")
                
                @schemas.classproperty
                def CARD_PROVISIONAL_CREDIT(cls):
                    return cls("CARD_PROVISIONAL_CREDIT")
                
                @schemas.classproperty
                def CARD_CHARGEBACK(cls):
                    return cls("CARD_CHARGEBACK")
                
                @schemas.classproperty
                def CARD_CHARGEBACK_WRITEOFF(cls):
                    return cls("CARD_CHARGEBACK_WRITEOFF")
            
            
            class capture_mode(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "IMMEDIATE": "IMMEDIATE",
                        "MANUAL": "MANUAL",
                    }
                
                @schemas.classproperty
                def IMMEDIATE(cls):
                    return cls("IMMEDIATE")
                
                @schemas.classproperty
                def MANUAL(cls):
                    return cls("MANUAL")
            expires_at = schemas.DateTimeSchema
            final_customer_id = schemas.UUIDSchema
            memo = schemas.StrSchema
            metadata = schemas.DictSchema
            originating_account_alias = schemas.StrSchema
            originating_account_customer_id = schemas.UUIDSchema
            originating_account_id = schemas.UUIDSchema
            receiving_account_alias = schemas.StrSchema
            receiving_account_customer_id = schemas.UUIDSchema
            receiving_account_id = schemas.UUIDSchema
            __annotations__ = {
                "amount": amount,
                "currency": currency,
                "type": type,
                "capture_mode": capture_mode,
                "expires_at": expires_at,
                "final_customer_id": final_customer_id,
                "memo": memo,
                "metadata": metadata,
                "originating_account_alias": originating_account_alias,
                "originating_account_customer_id": originating_account_customer_id,
                "originating_account_id": originating_account_id,
                "receiving_account_alias": receiving_account_alias,
                "receiving_account_customer_id": receiving_account_customer_id,
                "receiving_account_id": receiving_account_id,
            }
    
    amount: MetaOapg.properties.amount
    currency: MetaOapg.properties.currency
    type: MetaOapg.properties.type
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["amount"]) -> MetaOapg.properties.amount: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["currency"]) -> MetaOapg.properties.currency: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["type"]) -> MetaOapg.properties.type: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["capture_mode"]) -> MetaOapg.properties.capture_mode: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["expires_at"]) -> MetaOapg.properties.expires_at: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["final_customer_id"]) -> MetaOapg.properties.final_customer_id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["memo"]) -> MetaOapg.properties.memo: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["metadata"]) -> MetaOapg.properties.metadata: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["originating_account_alias"]) -> MetaOapg.properties.originating_account_alias: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["originating_account_customer_id"]) -> MetaOapg.properties.originating_account_customer_id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["originating_account_id"]) -> MetaOapg.properties.originating_account_id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["receiving_account_alias"]) -> MetaOapg.properties.receiving_account_alias: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["receiving_account_customer_id"]) -> MetaOapg.properties.receiving_account_customer_id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["receiving_account_id"]) -> MetaOapg.properties.receiving_account_id: ...
    
    @typing.overload
    def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
    
    def __getitem__(self, name: typing.Union[typing_extensions.Literal["amount", "currency", "type", "capture_mode", "expires_at", "final_customer_id", "memo", "metadata", "originating_account_alias", "originating_account_customer_id", "originating_account_id", "receiving_account_alias", "receiving_account_customer_id", "receiving_account_id", ], str]):
        # dict_instance[name] accessor
        return super().__getitem__(name)
    
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["amount"]) -> MetaOapg.properties.amount: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["currency"]) -> MetaOapg.properties.currency: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["type"]) -> MetaOapg.properties.type: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["capture_mode"]) -> typing.Union[MetaOapg.properties.capture_mode, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["expires_at"]) -> typing.Union[MetaOapg.properties.expires_at, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["final_customer_id"]) -> typing.Union[MetaOapg.properties.final_customer_id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["memo"]) -> typing.Union[MetaOapg.properties.memo, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["metadata"]) -> typing.Union[MetaOapg.properties.metadata, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["originating_account_alias"]) -> typing.Union[MetaOapg.properties.originating_account_alias, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["originating_account_customer_id"]) -> typing.Union[MetaOapg.properties.originating_account_customer_id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["originating_account_id"]) -> typing.Union[MetaOapg.properties.originating_account_id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["receiving_account_alias"]) -> typing.Union[MetaOapg.properties.receiving_account_alias, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["receiving_account_customer_id"]) -> typing.Union[MetaOapg.properties.receiving_account_customer_id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["receiving_account_id"]) -> typing.Union[MetaOapg.properties.receiving_account_id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: str) -> typing.Union[schemas.UnsetAnyTypeSchema, schemas.Unset]: ...
    
    def get_item_oapg(self, name: typing.Union[typing_extensions.Literal["amount", "currency", "type", "capture_mode", "expires_at", "final_customer_id", "memo", "metadata", "originating_account_alias", "originating_account_customer_id", "originating_account_id", "receiving_account_alias", "receiving_account_customer_id", "receiving_account_id", ], str]):
        return super().get_item_oapg(name)
    

    def __new__(
        cls,
        *_args: typing.Union[dict, frozendict.frozendict, ],
        amount: typing.Union[MetaOapg.properties.amount, decimal.Decimal, int, ],
        currency: typing.Union[MetaOapg.properties.currency, str, ],
        type: typing.Union[MetaOapg.properties.type, str, ],
        capture_mode: typing.Union[MetaOapg.properties.capture_mode, str, schemas.Unset] = schemas.unset,
        expires_at: typing.Union[MetaOapg.properties.expires_at, str, datetime, schemas.Unset] = schemas.unset,
        final_customer_id: typing.Union[MetaOapg.properties.final_customer_id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        memo: typing.Union[MetaOapg.properties.memo, str, schemas.Unset] = schemas.unset,
        metadata: typing.Union[MetaOapg.properties.metadata, dict, frozendict.frozendict, schemas.Unset] = schemas.unset,
        originating_account_alias: typing.Union[MetaOapg.properties.originating_account_alias, str, schemas.Unset] = schemas.unset,
        originating_account_customer_id: typing.Union[MetaOapg.properties.originating_account_customer_id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        originating_account_id: typing.Union[MetaOapg.properties.originating_account_id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        receiving_account_alias: typing.Union[MetaOapg.properties.receiving_account_alias, str, schemas.Unset] = schemas.unset,
        receiving_account_customer_id: typing.Union[MetaOapg.properties.receiving_account_customer_id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        receiving_account_id: typing.Union[MetaOapg.properties.receiving_account_id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        _configuration: typing.Optional[schemas.Configuration] = None,
        **kwargs: typing.Union[schemas.AnyTypeSchema, dict, frozendict.frozendict, str, date, datetime, uuid.UUID, int, float, decimal.Decimal, None, list, tuple, bytes],
    ) -> 'InternalTransfer':
        return super().__new__(
            cls,
            *_args,
            amount=amount,
            currency=currency,
            type=type,
            capture_mode=capture_mode,
            expires_at=expires_at,
            final_customer_id=final_customer_id,
            memo=memo,
            metadata=metadata,
            originating_account_alias=originating_account_alias,
            originating_account_customer_id=originating_account_customer_id,
            originating_account_id=originating_account_id,
            receiving_account_alias=receiving_account_alias,
            receiving_account_customer_id=receiving_account_customer_id,
            receiving_account_id=receiving_account_id,
            _configuration=_configuration,
            **kwargs,
        )
