# Generated by oapi-gen. DO NOT EDIT.
from __future__ import annotations

from dataclasses import dataclass
from typing import Annotated, Protocol
from uuid import UUID

from msgspec import Meta

from ..models import CreateUserRequest as _models_CreateUserRequest
from ..models import CreateUserResponse as _models_CreateUserResponse
from ..models import HttpValidationError as _models_HttpValidationError
from ..models import UpdateUserRequest as _models_UpdateUserRequest
from ..models import UserItem as _models_UserItem
from ..models import UserListResponse as _models_UserListResponse


class ListUsers:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Возвращает список пользователей с пагинацией.\n\npage: Номер страницы\n\npage_size: Размер страницы"

        page: Annotated[int, Meta(ge=1)]
        page_size: Annotated[int, Meta(ge=1, le=100)]
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Информация о пользователе"

        body: _models_UserListResponse

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Не авторизован"

        pass

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Недостаточно прав"

        pass

    @dataclass(slots=True)
    class UnprocessableEntity(Exception):
        "Validation Error"

        body: _models_HttpValidationError

    type Response = Ok


class CreateUser:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Создает пользователя. Принимает email, имя, фамилию, отчество и роль.\nГенерирует пароль, отправляет его на email, создает пользователя и возвращает uuid.\n"

        body: _models_CreateUserRequest
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class Created:
        "Пользователь успешно создан"

        body: _models_CreateUserResponse

    @dataclass(slots=True)
    class BadRequest(Exception):
        "Некорректный запрос"

        pass

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Не авторизован"

        pass

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Недостаточно прав"

        pass

    @dataclass(slots=True)
    class Conflict(Exception):
        "Пользователь с таким email уже существует"

        pass

    @dataclass(slots=True)
    class UnprocessableEntity(Exception):
        "Validation Error"

        body: _models_HttpValidationError

    type Response = Created


class DeleteUser:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Удаляет пользователя из БД.\n\nuser_id: UUID пользователя"

        user_id: UUID
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class NoContent:
        "Пользователь удален"

        pass

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Не авторизован"

        pass

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Недостаточно прав"

        pass

    @dataclass(slots=True)
    class NotFound(Exception):
        "Пользователь не найден"

        pass

    @dataclass(slots=True)
    class UnprocessableEntity(Exception):
        "Validation Error"

        body: _models_HttpValidationError

    type Response = NoContent


class GetUser:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Отдает информацию о пользователе по его ID.\n\nuser_id: UUID пользователя"

        user_id: UUID
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Список пользователей"

        body: _models_UserItem

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Не авторизован"

        pass

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Недостаточно прав"

        pass

    @dataclass(slots=True)
    class NotFound(Exception):
        "Пользователь не найден"

        pass

    @dataclass(slots=True)
    class UnprocessableEntity(Exception):
        "Validation Error"

        body: _models_HttpValidationError

    type Response = Ok


class UpdateUser:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Обновить данные пользователя. Можно обновить имя, фамилию, отчество, активировать/деактивировать, разрешить смену пароля и выбрать список лицензий.\n\nuser_id: UUID пользователя"

        user_id: UUID
        body: _models_UpdateUserRequest
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Пользователь обновлен"

        body: _models_UserItem

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Не авторизован"

        pass

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Недостаточно прав"

        pass

    @dataclass(slots=True)
    class NotFound(Exception):
        "Пользователь не найден"

        pass

    @dataclass(slots=True)
    class UnprocessableEntity(Exception):
        "Validation Error"

        body: _models_HttpValidationError

    type Response = Ok


class AdminHandler(Protocol):
    async def list_users(self, request: ListUsers.Request) -> ListUsers.Response:
        "Список пользователей\n\nВозвращает список пользователей с пагинацией."
        ...

    async def create_user(self, request: CreateUser.Request) -> CreateUser.Response:
        "Добавить пользователя\n\nСоздает пользователя. Принимает email, имя, фамилию, отчество и роль.\nГенерирует пароль, отправляет его на email, создает пользователя и возвращает uuid.\n"
        ...

    async def delete_user(self, request: DeleteUser.Request) -> DeleteUser.Response:
        "Удалить пользователя\n\nУдаляет пользователя из БД."
        ...

    async def get_user(self, request: GetUser.Request) -> GetUser.Response:
        "Получить информацию о пользователе\n\nОтдает информацию о пользователе по его ID."
        ...

    async def update_user(self, request: UpdateUser.Request) -> UpdateUser.Response:
        "Обновить пользователя\n\nОбновить данные пользователя. Можно обновить имя, фамилию, отчество, активировать/деактивировать, разрешить смену пароля и выбрать список лицензий."
        ...
