# coding: utf-8

"""
    Collibra Data Governance Center Core API

    <p>The Core REST API allows you to create your own integrations with Collibra Data Governance Center.</p><p><i>Create custom applications to help users get access to the right data.</i></p>  # noqa: E501

    The version of the OpenAPI document: 2.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 collibra_core import schemas  # noqa: F401


class AddUserRequest(
    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 = {
            "emailAddress",
            "userName",
        }
        
        class properties:
            
            
            class userName(
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    max_length = 255
                    min_length = 1
            
            
            class emailAddress(
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    max_length = 255
                    min_length = 1
            firstName = schemas.StrSchema
            lastName = schemas.StrSchema
            
            
            class gender(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "MALE": "MALE",
                        "FEMALE": "FEMALE",
                        "UNKNOWN": "UNKNOWN",
                    }
                
                @schemas.classproperty
                def MALE(cls):
                    return cls("MALE")
                
                @schemas.classproperty
                def FEMALE(cls):
                    return cls("FEMALE")
                
                @schemas.classproperty
                def UNKNOWN(cls):
                    return cls("UNKNOWN")
            language = schemas.StrSchema
            
            
            class userGroupIds(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    items = schemas.UUIDSchema
            
                def __new__(
                    cls,
                    arg: typing.Union[typing.Tuple[typing.Union[MetaOapg.items, str, uuid.UUID, ]], typing.List[typing.Union[MetaOapg.items, str, uuid.UUID, ]]],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'userGroupIds':
                    return super().__new__(
                        cls,
                        arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> MetaOapg.items:
                    return super().__getitem__(i)
            
            
            class licenseType(
                schemas.EnumBase,
                schemas.StrSchema
            ):
            
            
                class MetaOapg:
                    enum_value_to_name = {
                        "CONSUMER": "CONSUMER",
                        "AUTHOR": "AUTHOR",
                    }
                
                @schemas.classproperty
                def CONSUMER(cls):
                    return cls("CONSUMER")
                
                @schemas.classproperty
                def AUTHOR(cls):
                    return cls("AUTHOR")
            
            
            class addresses(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    
                    @staticmethod
                    def items() -> typing.Type['Address']:
                        return Address
            
                def __new__(
                    cls,
                    arg: typing.Union[typing.Tuple['Address'], typing.List['Address']],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'addresses':
                    return super().__new__(
                        cls,
                        arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> 'Address':
                    return super().__getitem__(i)
            
            
            class phones(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    
                    @staticmethod
                    def items() -> typing.Type['PhoneNumber']:
                        return PhoneNumber
            
                def __new__(
                    cls,
                    arg: typing.Union[typing.Tuple['PhoneNumber'], typing.List['PhoneNumber']],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'phones':
                    return super().__new__(
                        cls,
                        arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> 'PhoneNumber':
                    return super().__getitem__(i)
            
            
            class additionalEmailAddresses(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    
                    @staticmethod
                    def items() -> typing.Type['Email']:
                        return Email
            
                def __new__(
                    cls,
                    arg: typing.Union[typing.Tuple['Email'], typing.List['Email']],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'additionalEmailAddresses':
                    return super().__new__(
                        cls,
                        arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> 'Email':
                    return super().__getitem__(i)
            
            
            class instantMessagingAccounts(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    
                    @staticmethod
                    def items() -> typing.Type['InstantMessagingAccount']:
                        return InstantMessagingAccount
            
                def __new__(
                    cls,
                    arg: typing.Union[typing.Tuple['InstantMessagingAccount'], typing.List['InstantMessagingAccount']],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'instantMessagingAccounts':
                    return super().__new__(
                        cls,
                        arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> 'InstantMessagingAccount':
                    return super().__getitem__(i)
            
            
            class websites(
                schemas.ListSchema
            ):
            
            
                class MetaOapg:
                    
                    @staticmethod
                    def items() -> typing.Type['Website']:
                        return Website
            
                def __new__(
                    cls,
                    arg: typing.Union[typing.Tuple['Website'], typing.List['Website']],
                    _configuration: typing.Optional[schemas.Configuration] = None,
                ) -> 'websites':
                    return super().__new__(
                        cls,
                        arg,
                        _configuration=_configuration,
                    )
            
                def __getitem__(self, i: int) -> 'Website':
                    return super().__getitem__(i)
            __annotations__ = {
                "userName": userName,
                "emailAddress": emailAddress,
                "firstName": firstName,
                "lastName": lastName,
                "gender": gender,
                "language": language,
                "userGroupIds": userGroupIds,
                "licenseType": licenseType,
                "addresses": addresses,
                "phones": phones,
                "additionalEmailAddresses": additionalEmailAddresses,
                "instantMessagingAccounts": instantMessagingAccounts,
                "websites": websites,
            }
    
    emailAddress: MetaOapg.properties.emailAddress
    userName: MetaOapg.properties.userName
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["userName"]) -> MetaOapg.properties.userName: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["emailAddress"]) -> MetaOapg.properties.emailAddress: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["firstName"]) -> MetaOapg.properties.firstName: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["lastName"]) -> MetaOapg.properties.lastName: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["gender"]) -> MetaOapg.properties.gender: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["language"]) -> MetaOapg.properties.language: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["userGroupIds"]) -> MetaOapg.properties.userGroupIds: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["licenseType"]) -> MetaOapg.properties.licenseType: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["addresses"]) -> MetaOapg.properties.addresses: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["phones"]) -> MetaOapg.properties.phones: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["additionalEmailAddresses"]) -> MetaOapg.properties.additionalEmailAddresses: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["instantMessagingAccounts"]) -> MetaOapg.properties.instantMessagingAccounts: ...
    
    @typing.overload
    def __getitem__(self, name: typing_extensions.Literal["websites"]) -> MetaOapg.properties.websites: ...
    
    @typing.overload
    def __getitem__(self, name: str) -> schemas.UnsetAnyTypeSchema: ...
    
    def __getitem__(self, name: typing.Union[typing_extensions.Literal["userName", "emailAddress", "firstName", "lastName", "gender", "language", "userGroupIds", "licenseType", "addresses", "phones", "additionalEmailAddresses", "instantMessagingAccounts", "websites", ], str]):
        # dict_instance[name] accessor
        return super().__getitem__(name)
    
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["userName"]) -> MetaOapg.properties.userName: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["emailAddress"]) -> MetaOapg.properties.emailAddress: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["firstName"]) -> typing.Union[MetaOapg.properties.firstName, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["lastName"]) -> typing.Union[MetaOapg.properties.lastName, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["gender"]) -> typing.Union[MetaOapg.properties.gender, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["language"]) -> typing.Union[MetaOapg.properties.language, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["userGroupIds"]) -> typing.Union[MetaOapg.properties.userGroupIds, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["licenseType"]) -> typing.Union[MetaOapg.properties.licenseType, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["addresses"]) -> typing.Union[MetaOapg.properties.addresses, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["phones"]) -> typing.Union[MetaOapg.properties.phones, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["additionalEmailAddresses"]) -> typing.Union[MetaOapg.properties.additionalEmailAddresses, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["instantMessagingAccounts"]) -> typing.Union[MetaOapg.properties.instantMessagingAccounts, schemas.Unset]: ...
    
    @typing.overload
    def get_item_oapg(self, name: typing_extensions.Literal["websites"]) -> typing.Union[MetaOapg.properties.websites, 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["userName", "emailAddress", "firstName", "lastName", "gender", "language", "userGroupIds", "licenseType", "addresses", "phones", "additionalEmailAddresses", "instantMessagingAccounts", "websites", ], str]):
        return super().get_item_oapg(name)
    

    def __new__(
        cls,
        *args: typing.Union[dict, frozendict.frozendict, ],
        emailAddress: typing.Union[MetaOapg.properties.emailAddress, str, ],
        userName: typing.Union[MetaOapg.properties.userName, str, ],
        firstName: typing.Union[MetaOapg.properties.firstName, str, schemas.Unset] = schemas.unset,
        lastName: typing.Union[MetaOapg.properties.lastName, str, schemas.Unset] = schemas.unset,
        gender: typing.Union[MetaOapg.properties.gender, str, schemas.Unset] = schemas.unset,
        language: typing.Union[MetaOapg.properties.language, str, schemas.Unset] = schemas.unset,
        userGroupIds: typing.Union[MetaOapg.properties.userGroupIds, list, tuple, schemas.Unset] = schemas.unset,
        licenseType: typing.Union[MetaOapg.properties.licenseType, str, schemas.Unset] = schemas.unset,
        addresses: typing.Union[MetaOapg.properties.addresses, list, tuple, schemas.Unset] = schemas.unset,
        phones: typing.Union[MetaOapg.properties.phones, list, tuple, schemas.Unset] = schemas.unset,
        additionalEmailAddresses: typing.Union[MetaOapg.properties.additionalEmailAddresses, list, tuple, schemas.Unset] = schemas.unset,
        instantMessagingAccounts: typing.Union[MetaOapg.properties.instantMessagingAccounts, list, tuple, schemas.Unset] = schemas.unset,
        websites: typing.Union[MetaOapg.properties.websites, list, tuple, 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],
    ) -> 'AddUserRequest':
        return super().__new__(
            cls,
            *args,
            emailAddress=emailAddress,
            userName=userName,
            firstName=firstName,
            lastName=lastName,
            gender=gender,
            language=language,
            userGroupIds=userGroupIds,
            licenseType=licenseType,
            addresses=addresses,
            phones=phones,
            additionalEmailAddresses=additionalEmailAddresses,
            instantMessagingAccounts=instantMessagingAccounts,
            websites=websites,
            _configuration=_configuration,
            **kwargs,
        )

from collibra_core.model.address import Address
from collibra_core.model.email import Email
from collibra_core.model.instant_messaging_account import InstantMessagingAccount
from collibra_core.model.phone_number import PhoneNumber
from collibra_core.model.website import Website
