# 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 OriginalCreditSenderData(
    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 = {
            "funding_source",
        }
        
        class properties:
            
            
            class funding_source(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "credit": "CREDIT",
                        "debit": "DEBIT",
                        "prepaid": "PREPAID",
                        "deposit_account": "DEPOSIT_ACCOUNT",
                        "cash": "CASH",
                        "mobile_money_payment": "MOBILE_MONEY_PAYMENT",
                        "non_visa_credit": "NON_VISA_CREDIT",
                    }
                
                @schemas.classproperty
                def CREDIT(cls):
                    return cls("credit")
                
                @schemas.classproperty
                def DEBIT(cls):
                    return cls("debit")
                
                @schemas.classproperty
                def PREPAID(cls):
                    return cls("prepaid")
                
                @schemas.classproperty
                def DEPOSIT_ACCOUNT(cls):
                    return cls("deposit_account")
                
                @schemas.classproperty
                def CASH(cls):
                    return cls("cash")
                
                @schemas.classproperty
                def MOBILE_MONEY_PAYMENT(cls):
                    return cls("mobile_money_payment")
                
                @schemas.classproperty
                def NON_VISA_CREDIT(cls):
                    return cls("non_visa_credit")
            sender_account_number = schemas.StrSchema
            
            
            class sender_account_type(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "other": "OTHER",
                        "rtn_bank_account": "RTN_BANK_ACCOUNT",
                        "iban": "IBAN",
                        "card_account": "CARD_ACCOUNT",
                        "email": "EMAIL",
                        "phone_number": "PHONE_NUMBER",
                        "bank_account_number_and_identification_code": "BANK_ACCOUNT_NUMBER_AND_IDENTIFICATION_CODE",
                        "wallet_id": "WALLET_ID",
                        "social_network_id": "SOCIAL_NETWORK_ID",
                    }
                
                @schemas.classproperty
                def OTHER(cls):
                    return cls("other")
                
                @schemas.classproperty
                def RTN_BANK_ACCOUNT(cls):
                    return cls("rtn_bank_account")
                
                @schemas.classproperty
                def IBAN(cls):
                    return cls("iban")
                
                @schemas.classproperty
                def CARD_ACCOUNT(cls):
                    return cls("card_account")
                
                @schemas.classproperty
                def EMAIL(cls):
                    return cls("email")
                
                @schemas.classproperty
                def PHONE_NUMBER(cls):
                    return cls("phone_number")
                
                @schemas.classproperty
                def BANK_ACCOUNT_NUMBER_AND_IDENTIFICATION_CODE(cls):
                    return cls("bank_account_number_and_identification_code")
                
                @schemas.classproperty
                def WALLET_ID(cls):
                    return cls("wallet_id")
                
                @schemas.classproperty
                def SOCIAL_NETWORK_ID(cls):
                    return cls("social_network_id")
            sender_address = schemas.StrSchema
            sender_city = schemas.StrSchema
            sender_country = schemas.StrSchema
            sender_name = schemas.StrSchema
            sender_reference_number = schemas.StrSchema
            sender_state = schemas.StrSchema
            
            
            class transaction_purpose(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "family_support": "FAMILY_SUPPORT",
                        "labor_transfers": "LABOR_TRANSFERS",
                        "travel": "TRAVEL",
                        "education": "EDUCATION",
                        "medical_treatment": "MEDICAL_TREATMENT",
                        "emergency_need": "EMERGENCY_NEED",
                        "savings": "SAVINGS",
                        "gifts": "GIFTS",
                        "other": "OTHER",
                        "salary": "SALARY",
                        "lending": "LENDING",
                        "crypto_currency": "CRYPTO_CURRENCY",
                    }
                
                @schemas.classproperty
                def FAMILY_SUPPORT(cls):
                    return cls("family_support")
                
                @schemas.classproperty
                def LABOR_TRANSFERS(cls):
                    return cls("labor_transfers")
                
                @schemas.classproperty
                def TRAVEL(cls):
                    return cls("travel")
                
                @schemas.classproperty
                def EDUCATION(cls):
                    return cls("education")
                
                @schemas.classproperty
                def MEDICAL_TREATMENT(cls):
                    return cls("medical_treatment")
                
                @schemas.classproperty
                def EMERGENCY_NEED(cls):
                    return cls("emergency_need")
                
                @schemas.classproperty
                def SAVINGS(cls):
                    return cls("savings")
                
                @schemas.classproperty
                def GIFTS(cls):
                    return cls("gifts")
                
                @schemas.classproperty
                def OTHER(cls):
                    return cls("other")
                
                @schemas.classproperty
                def SALARY(cls):
                    return cls("salary")
                
                @schemas.classproperty
                def LENDING(cls):
                    return cls("lending")
                
                @schemas.classproperty
                def CRYPTO_CURRENCY(cls):
                    return cls("crypto_currency")
            
            
            class unique_transaction_reference_number(
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    max_length = 17
                    min_length = 1
            __annotations__ = {
                "funding_source": funding_source,
                "sender_account_number": sender_account_number,
                "sender_account_type": sender_account_type,
                "sender_address": sender_address,
                "sender_city": sender_city,
                "sender_country": sender_country,
                "sender_name": sender_name,
                "sender_reference_number": sender_reference_number,
                "sender_state": sender_state,
                "transaction_purpose": transaction_purpose,
                "unique_transaction_reference_number": unique_transaction_reference_number,
            }
    
    funding_source: MetaOapg.properties.funding_source
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["funding_source"]) -> MetaOapg.properties.funding_source: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_account_number"]) -> MetaOapg.properties.sender_account_number: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_account_type"]) -> MetaOapg.properties.sender_account_type: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_address"]) -> MetaOapg.properties.sender_address: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_city"]) -> MetaOapg.properties.sender_city: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_country"]) -> MetaOapg.properties.sender_country: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_name"]) -> MetaOapg.properties.sender_name: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_reference_number"]) -> MetaOapg.properties.sender_reference_number: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["sender_state"]) -> MetaOapg.properties.sender_state: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["transaction_purpose"]) -> MetaOapg.properties.transaction_purpose: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["unique_transaction_reference_number"]) -> MetaOapg.properties.unique_transaction_reference_number: ...
    
    @typing.overload
    def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
    
    def __getitem__(self, name: typing.Union[typing_extensions.Literal["funding_source", "sender_account_number", "sender_account_type", "sender_address", "sender_city", "sender_country", "sender_name", "sender_reference_number", "sender_state", "transaction_purpose", "unique_transaction_reference_number", ], str]):
        # dict_instance[name] accessor
        return super().__getitem__(name)
    
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["funding_source"]) -> MetaOapg.properties.funding_source: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_account_number"]) -> typing.Union[MetaOapg.properties.sender_account_number, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_account_type"]) -> typing.Union[MetaOapg.properties.sender_account_type, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_address"]) -> typing.Union[MetaOapg.properties.sender_address, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_city"]) -> typing.Union[MetaOapg.properties.sender_city, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_country"]) -> typing.Union[MetaOapg.properties.sender_country, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_name"]) -> typing.Union[MetaOapg.properties.sender_name, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_reference_number"]) -> typing.Union[MetaOapg.properties.sender_reference_number, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["sender_state"]) -> typing.Union[MetaOapg.properties.sender_state, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["transaction_purpose"]) -> typing.Union[MetaOapg.properties.transaction_purpose, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["unique_transaction_reference_number"]) -> typing.Union[MetaOapg.properties.unique_transaction_reference_number, 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["funding_source", "sender_account_number", "sender_account_type", "sender_address", "sender_city", "sender_country", "sender_name", "sender_reference_number", "sender_state", "transaction_purpose", "unique_transaction_reference_number", ], str]):
        return super().get_item_oapg(name)
    

    def __new__(
        cls,
        *_args: typing.Union[dict, frozendict.frozendict, ],
        funding_source: typing.Union[MetaOapg.properties.funding_source, str, ],
        sender_account_number: typing.Union[MetaOapg.properties.sender_account_number, str, schemas.Unset] = schemas.unset,
        sender_account_type: typing.Union[MetaOapg.properties.sender_account_type, str, schemas.Unset] = schemas.unset,
        sender_address: typing.Union[MetaOapg.properties.sender_address, str, schemas.Unset] = schemas.unset,
        sender_city: typing.Union[MetaOapg.properties.sender_city, str, schemas.Unset] = schemas.unset,
        sender_country: typing.Union[MetaOapg.properties.sender_country, str, schemas.Unset] = schemas.unset,
        sender_name: typing.Union[MetaOapg.properties.sender_name, str, schemas.Unset] = schemas.unset,
        sender_reference_number: typing.Union[MetaOapg.properties.sender_reference_number, str, schemas.Unset] = schemas.unset,
        sender_state: typing.Union[MetaOapg.properties.sender_state, str, schemas.Unset] = schemas.unset,
        transaction_purpose: typing.Union[MetaOapg.properties.transaction_purpose, str, schemas.Unset] = schemas.unset,
        unique_transaction_reference_number: typing.Union[MetaOapg.properties.unique_transaction_reference_number, str, 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],
    ) -> 'OriginalCreditSenderData':
        return super().__new__(
            cls,
            *_args,
            funding_source=funding_source,
            sender_account_number=sender_account_number,
            sender_account_type=sender_account_type,
            sender_address=sender_address,
            sender_city=sender_city,
            sender_country=sender_country,
            sender_name=sender_name,
            sender_reference_number=sender_reference_number,
            sender_state=sender_state,
            transaction_purpose=transaction_purpose,
            unique_transaction_reference_number=unique_transaction_reference_number,
            _configuration=_configuration,
            **kwargs,
        )
