# 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 Base(
    schemas.DictSchema
):
    """NOTE: This class is auto generated by OpenAPI Generator.
    Ref: https://openapi-generator.tech

    Do not edit the class manually.
    """


    class MetaOapg:
        
        class properties:
            creation_time = schemas.DateTimeSchema
            ein = schemas.StrSchema
            email = schemas.StrSchema
            entity_name = schemas.StrSchema
            formation_date = schemas.DateSchema
            formation_state = schemas.StrSchema
            id = schemas.UUIDSchema
            is_customer = schemas.BoolSchema
            last_updated_time = schemas.DateTimeSchema
        
            @staticmethod
            def legal_address() -> typing.Type['Address']:
                return Address
            metadata = schemas.DictSchema
            
            
            class phone_number(
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    regex=[{
                        'pattern': r'^\+[1-9]\d{1,14}$',  # noqa: E501
                    }]
            
            
            class status(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "PROSPECT": "PROSPECT",
                        "ACTIVE": "ACTIVE",
                        "FROZEN": "FROZEN",
                        "SANCTION": "SANCTION",
                        "DISSOLVED": "DISSOLVED",
                        "CANCELLED": "CANCELLED",
                        "SUSPENDED": "SUSPENDED",
                        "MERGED": "MERGED",
                        "INACTIVE": "INACTIVE",
                        "CONVERTED": "CONVERTED",
                    }
                
                @schemas.classproperty
                def PROSPECT(cls):
                    return cls("PROSPECT")
                
                @schemas.classproperty
                def ACTIVE(cls):
                    return cls("ACTIVE")
                
                @schemas.classproperty
                def FROZEN(cls):
                    return cls("FROZEN")
                
                @schemas.classproperty
                def SANCTION(cls):
                    return cls("SANCTION")
                
                @schemas.classproperty
                def DISSOLVED(cls):
                    return cls("DISSOLVED")
                
                @schemas.classproperty
                def CANCELLED(cls):
                    return cls("CANCELLED")
                
                @schemas.classproperty
                def SUSPENDED(cls):
                    return cls("SUSPENDED")
                
                @schemas.classproperty
                def MERGED(cls):
                    return cls("MERGED")
                
                @schemas.classproperty
                def INACTIVE(cls):
                    return cls("INACTIVE")
                
                @schemas.classproperty
                def CONVERTED(cls):
                    return cls("CONVERTED")
            
            
            class structure(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "SOLE_PROPRIETORSHIP": "SOLE_PROPRIETORSHIP",
                        "PARTNERSHIP": "PARTNERSHIP",
                        "LLC": "LLC",
                        "CORPORATION": "CORPORATION",
                        "S_CORPORATION": "S_CORPORATION",
                        "NON_PROFIT": "NON_PROFIT",
                        "OTHER": "OTHER",
                    }
                
                @schemas.classproperty
                def SOLE_PROPRIETORSHIP(cls):
                    return cls("SOLE_PROPRIETORSHIP")
                
                @schemas.classproperty
                def PARTNERSHIP(cls):
                    return cls("PARTNERSHIP")
                
                @schemas.classproperty
                def LLC(cls):
                    return cls("LLC")
                
                @schemas.classproperty
                def CORPORATION(cls):
                    return cls("CORPORATION")
                
                @schemas.classproperty
                def S_CORPORATION(cls):
                    return cls("S_CORPORATION")
                
                @schemas.classproperty
                def NON_PROFIT(cls):
                    return cls("NON_PROFIT")
                
                @schemas.classproperty
                def OTHER(cls):
                    return cls("OTHER")
            tenant = schemas.StrSchema
            
            
            class trade_names(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    items = schemas.StrSchema
            
                def __new__(
                    cls,
                    _arg: typing.Union[typing.Tuple[typing.Union[MetaOapg.items, str, ]], typing.List[typing.Union[MetaOapg.items, str, ]]],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'trade_names':
                    return super().__new__(
                        cls,
                        _arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> MetaOapg.items:
                    return super().__getitem__(i)
            verification_last_run = schemas.DateTimeSchema
        
            @staticmethod
            def verification_status() -> typing.Type['VerificationStatus']:
                return VerificationStatus
            website = schemas.StrSchema
            __annotations__ = {
                "creation_time": creation_time,
                "ein": ein,
                "email": email,
                "entity_name": entity_name,
                "formation_date": formation_date,
                "formation_state": formation_state,
                "id": id,
                "is_customer": is_customer,
                "last_updated_time": last_updated_time,
                "legal_address": legal_address,
                "metadata": metadata,
                "phone_number": phone_number,
                "status": status,
                "structure": structure,
                "tenant": tenant,
                "trade_names": trade_names,
                "verification_last_run": verification_last_run,
                "verification_status": verification_status,
                "website": website,
            }
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["creation_time"]) -> MetaOapg.properties.creation_time: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["ein"]) -> MetaOapg.properties.ein: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["email"]) -> MetaOapg.properties.email: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["entity_name"]) -> MetaOapg.properties.entity_name: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["formation_date"]) -> MetaOapg.properties.formation_date: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["formation_state"]) -> MetaOapg.properties.formation_state: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["id"]) -> MetaOapg.properties.id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["is_customer"]) -> MetaOapg.properties.is_customer: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["last_updated_time"]) -> MetaOapg.properties.last_updated_time: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["legal_address"]) -> 'Address': ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["metadata"]) -> MetaOapg.properties.metadata: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["phone_number"]) -> MetaOapg.properties.phone_number: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["status"]) -> MetaOapg.properties.status: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["structure"]) -> MetaOapg.properties.structure: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["tenant"]) -> MetaOapg.properties.tenant: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["trade_names"]) -> MetaOapg.properties.trade_names: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["verification_last_run"]) -> MetaOapg.properties.verification_last_run: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["verification_status"]) -> 'VerificationStatus': ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["website"]) -> MetaOapg.properties.website: ...
    
    @typing.overload
    def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
    
    def __getitem__(self, name: typing.Union[typing_extensions.Literal["creation_time", "ein", "email", "entity_name", "formation_date", "formation_state", "id", "is_customer", "last_updated_time", "legal_address", "metadata", "phone_number", "status", "structure", "tenant", "trade_names", "verification_last_run", "verification_status", "website", ], str]):
        # dict_instance[name] accessor
        return super().__getitem__(name)
    
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["creation_time"]) -> typing.Union[MetaOapg.properties.creation_time, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["ein"]) -> typing.Union[MetaOapg.properties.ein, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["email"]) -> typing.Union[MetaOapg.properties.email, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["entity_name"]) -> typing.Union[MetaOapg.properties.entity_name, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["formation_date"]) -> typing.Union[MetaOapg.properties.formation_date, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["formation_state"]) -> typing.Union[MetaOapg.properties.formation_state, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["id"]) -> typing.Union[MetaOapg.properties.id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["is_customer"]) -> typing.Union[MetaOapg.properties.is_customer, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["last_updated_time"]) -> typing.Union[MetaOapg.properties.last_updated_time, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["legal_address"]) -> typing.Union['Address', 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["phone_number"]) -> typing.Union[MetaOapg.properties.phone_number, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["status"]) -> typing.Union[MetaOapg.properties.status, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["structure"]) -> typing.Union[MetaOapg.properties.structure, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["tenant"]) -> typing.Union[MetaOapg.properties.tenant, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["trade_names"]) -> typing.Union[MetaOapg.properties.trade_names, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["verification_last_run"]) -> typing.Union[MetaOapg.properties.verification_last_run, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["verification_status"]) -> typing.Union['VerificationStatus', schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["website"]) -> typing.Union[MetaOapg.properties.website, 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["creation_time", "ein", "email", "entity_name", "formation_date", "formation_state", "id", "is_customer", "last_updated_time", "legal_address", "metadata", "phone_number", "status", "structure", "tenant", "trade_names", "verification_last_run", "verification_status", "website", ], str]):
        return super().get_item_oapg(name)
    

    def __new__(
        cls,
        *_args: typing.Union[dict, frozendict.frozendict, ],
        creation_time: typing.Union[MetaOapg.properties.creation_time, str, datetime, schemas.Unset] = schemas.unset,
        ein: typing.Union[MetaOapg.properties.ein, str, schemas.Unset] = schemas.unset,
        email: typing.Union[MetaOapg.properties.email, str, schemas.Unset] = schemas.unset,
        entity_name: typing.Union[MetaOapg.properties.entity_name, str, schemas.Unset] = schemas.unset,
        formation_date: typing.Union[MetaOapg.properties.formation_date, str, date, schemas.Unset] = schemas.unset,
        formation_state: typing.Union[MetaOapg.properties.formation_state, str, schemas.Unset] = schemas.unset,
        id: typing.Union[MetaOapg.properties.id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        is_customer: typing.Union[MetaOapg.properties.is_customer, bool, schemas.Unset] = schemas.unset,
        last_updated_time: typing.Union[MetaOapg.properties.last_updated_time, str, datetime, schemas.Unset] = schemas.unset,
        legal_address: typing.Union['Address', schemas.Unset] = schemas.unset,
        metadata: typing.Union[MetaOapg.properties.metadata, dict, frozendict.frozendict, schemas.Unset] = schemas.unset,
        phone_number: typing.Union[MetaOapg.properties.phone_number, str, schemas.Unset] = schemas.unset,
        status: typing.Union[MetaOapg.properties.status, str, schemas.Unset] = schemas.unset,
        structure: typing.Union[MetaOapg.properties.structure, str, schemas.Unset] = schemas.unset,
        tenant: typing.Union[MetaOapg.properties.tenant, str, schemas.Unset] = schemas.unset,
        trade_names: typing.Union[MetaOapg.properties.trade_names, list, tuple, schemas.Unset] = schemas.unset,
        verification_last_run: typing.Union[MetaOapg.properties.verification_last_run, str, datetime, schemas.Unset] = schemas.unset,
        verification_status: typing.Union['VerificationStatus', schemas.Unset] = schemas.unset,
        website: typing.Union[MetaOapg.properties.website, 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],
    ) -> 'Base':
        return super().__new__(
            cls,
            *_args,
            creation_time=creation_time,
            ein=ein,
            email=email,
            entity_name=entity_name,
            formation_date=formation_date,
            formation_state=formation_state,
            id=id,
            is_customer=is_customer,
            last_updated_time=last_updated_time,
            legal_address=legal_address,
            metadata=metadata,
            phone_number=phone_number,
            status=status,
            structure=structure,
            tenant=tenant,
            trade_names=trade_names,
            verification_last_run=verification_last_run,
            verification_status=verification_status,
            website=website,
            _configuration=_configuration,
            **kwargs,
        )

from synctera_client.model.address import Address
from synctera_client.model.verification_status import VerificationStatus
