# 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.43.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 Document(
    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:
        
            @staticmethod
            def available_versions() -> typing.Type['DocumentVersions']:
                return DocumentVersions
            creation_time = schemas.DateTimeSchema
            description = schemas.StrSchema
        
            @staticmethod
            def encryption() -> typing.Type['Encryption']:
                return Encryption
            file_name = schemas.StrSchema
            id = schemas.UUIDSchema
            is_restricted = schemas.BoolSchema
            last_updated_time = schemas.DateTimeSchema
            metadata = schemas.DictSchema
            name = schemas.StrSchema
            related_resource_id = schemas.UUIDSchema
        
            @staticmethod
            def related_resource_type() -> typing.Type['RelatedResourceType']:
                return RelatedResourceType
            tenant = schemas.StrSchema
        
            @staticmethod
            def type() -> typing.Type['DocumentType']:
                return DocumentType
            version = schemas.IntSchema
            __annotations__ = {
                "available_versions": available_versions,
                "creation_time": creation_time,
                "description": description,
                "encryption": encryption,
                "file_name": file_name,
                "id": id,
                "is_restricted": is_restricted,
                "last_updated_time": last_updated_time,
                "metadata": metadata,
                "name": name,
                "related_resource_id": related_resource_id,
                "related_resource_type": related_resource_type,
                "tenant": tenant,
                "type": type,
                "version": version,
            }
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["available_versions"]) -> 'DocumentVersions': ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["creation_time"]) -> MetaOapg.properties.creation_time: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["description"]) -> MetaOapg.properties.description: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["encryption"]) -> 'Encryption': ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["file_name"]) -> MetaOapg.properties.file_name: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["id"]) -> MetaOapg.properties.id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["is_restricted"]) -> MetaOapg.properties.is_restricted: ...
    
    @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["metadata"]) -> MetaOapg.properties.metadata: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["name"]) -> MetaOapg.properties.name: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["related_resource_id"]) -> MetaOapg.properties.related_resource_id: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["related_resource_type"]) -> 'RelatedResourceType': ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["tenant"]) -> MetaOapg.properties.tenant: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["type"]) -> 'DocumentType': ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["version"]) -> MetaOapg.properties.version: ...
    
    @typing.overload
    def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
    
    def __getitem__(self, name: typing.Union[typing_extensions.Literal["available_versions", "creation_time", "description", "encryption", "file_name", "id", "is_restricted", "last_updated_time", "metadata", "name", "related_resource_id", "related_resource_type", "tenant", "type", "version", ], str]):
        # dict_instance[name] accessor
        return super().__getitem__(name)
    
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["available_versions"]) -> typing.Union['DocumentVersions', schemas.Unset]: ...
    
    @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["description"]) -> typing.Union[MetaOapg.properties.description, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["encryption"]) -> typing.Union['Encryption', schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["file_name"]) -> typing.Union[MetaOapg.properties.file_name, 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_restricted"]) -> typing.Union[MetaOapg.properties.is_restricted, 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["metadata"]) -> typing.Union[MetaOapg.properties.metadata, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["name"]) -> typing.Union[MetaOapg.properties.name, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["related_resource_id"]) -> typing.Union[MetaOapg.properties.related_resource_id, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["related_resource_type"]) -> typing.Union['RelatedResourceType', 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["type"]) -> typing.Union['DocumentType', schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["version"]) -> typing.Union[MetaOapg.properties.version, 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["available_versions", "creation_time", "description", "encryption", "file_name", "id", "is_restricted", "last_updated_time", "metadata", "name", "related_resource_id", "related_resource_type", "tenant", "type", "version", ], str]):
        return super().get_item_oapg(name)
    

    def __new__(
        cls,
        *_args: typing.Union[dict, frozendict.frozendict, ],
        available_versions: typing.Union['DocumentVersions', schemas.Unset] = schemas.unset,
        creation_time: typing.Union[MetaOapg.properties.creation_time, str, datetime, schemas.Unset] = schemas.unset,
        description: typing.Union[MetaOapg.properties.description, str, schemas.Unset] = schemas.unset,
        encryption: typing.Union['Encryption', schemas.Unset] = schemas.unset,
        file_name: typing.Union[MetaOapg.properties.file_name, str, schemas.Unset] = schemas.unset,
        id: typing.Union[MetaOapg.properties.id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        is_restricted: typing.Union[MetaOapg.properties.is_restricted, bool, schemas.Unset] = schemas.unset,
        last_updated_time: typing.Union[MetaOapg.properties.last_updated_time, str, datetime, schemas.Unset] = schemas.unset,
        metadata: typing.Union[MetaOapg.properties.metadata, dict, frozendict.frozendict, schemas.Unset] = schemas.unset,
        name: typing.Union[MetaOapg.properties.name, str, schemas.Unset] = schemas.unset,
        related_resource_id: typing.Union[MetaOapg.properties.related_resource_id, str, uuid.UUID, schemas.Unset] = schemas.unset,
        related_resource_type: typing.Union['RelatedResourceType', schemas.Unset] = schemas.unset,
        tenant: typing.Union[MetaOapg.properties.tenant, str, schemas.Unset] = schemas.unset,
        type: typing.Union['DocumentType', schemas.Unset] = schemas.unset,
        version: typing.Union[MetaOapg.properties.version, decimal.Decimal, int, 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],
    ) -> 'Document':
        return super().__new__(
            cls,
            *_args,
            available_versions=available_versions,
            creation_time=creation_time,
            description=description,
            encryption=encryption,
            file_name=file_name,
            id=id,
            is_restricted=is_restricted,
            last_updated_time=last_updated_time,
            metadata=metadata,
            name=name,
            related_resource_id=related_resource_id,
            related_resource_type=related_resource_type,
            tenant=tenant,
            type=type,
            version=version,
            _configuration=_configuration,
            **kwargs,
        )

from synctera_client.model.document_type import DocumentType
from synctera_client.model.document_versions import DocumentVersions
from synctera_client.model.encryption import Encryption
from synctera_client.model.related_resource_type import RelatedResourceType
