# Generated by oapi-gen 0.1.0. DO NOT EDIT.
# Source SHA256: bc992a4f0e652367ab7756437f7207d1c1db579e44540e68c06834396fc1ce98
from __future__ import annotations

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

from msgspec import Meta

from . import models as _models
from ._cookies import Cookie as Cookie


@dataclass(frozen=True, slots=True)
class BearerAuthSecurity:
    api_key: str
    roles: tuple[str, ...]


class SecurityRejected(Exception):
    """Signal that one security alternative was not accepted."""


class SecurityHandler(Protocol):
    async def handle_bearer_auth(
        self, context: object | None, operation_id: str, credential: BearerAuthSecurity
    ) -> object | None: ...


class Login:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Авторизует пользователя по email и паролю, выдает JWT и refresh token в cookie."

        body: _models.LoginRequest

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Успешная авторизация\n\nset_cookie: JWT и refresh token установлены в cookie"

        body: _models.AuthSuccessResponse
        set_cookie: list[Cookie] | None = None

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

        pass

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Неверный email или пароль"

        pass

    @dataclass(slots=True)
    class Forbidden(Exception):
        "Пользователь заблокирован"

        pass

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

        body: _models.HttpValidationError

    type Response = Ok


class Logout:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Удаляет access и refresh токены из Cookie"

        pass

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Сессия завершена\n\nset_cookie: JWT и refresh token удалены из cookie"

        body: _models.MessageResponse
        set_cookie: str | None = None

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

        body: _models.HttpValidationError

    type Response = Ok


class GetCurrentUser:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Полная информация о текущем пользователе с его доступными лицензиями"

        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 UnprocessableEntity(Exception):
        "Validation Error"

        body: _models.HttpValidationError

    type Response = Ok


class UpdatePassword:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Обновляет пароль пользователя, если JWT валиден.\nВ ответе устанавливает новые JWT и refresh token в cookie.\n"

        body: _models.UpdatePasswordRequest
        security_context: object | None

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Пароль успешно обновлен\n\nset_cookie: Новые JWT и refresh token установлены в cookie"

        body: _models.AuthSuccessResponse
        set_cookie: str | None = None

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

        pass

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "JWT отсутствует или невалиден"

        pass

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

        body: _models.HttpValidationError

    type Response = Ok


class RequestPasswordReset:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Отправляет на email ссылку для сброса пароля."

        body: _models.PasswordResetRequest

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Если пользователь существует, письмо отправлено"

        body: _models.MessageResponse

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

        body: _models.HttpValidationError

    type Response = Ok


class ResetPassword:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Принимает новый пароль и token из ссылки, сбрасывает пароль если token валиден."

        body: _models.PasswordResetConfirmRequest

    @dataclass(frozen=True, slots=True)
    class Ok:
        "Пароль успешно сброшен"

        body: _models.MessageResponse

    @dataclass(slots=True)
    class BadRequest(Exception):
        "Невалидный запрос"

        pass

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Невалидный или истекший token"

        pass

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

        body: _models.HttpValidationError

    type Response = Ok


class RefreshToken:
    @dataclass(frozen=True, slots=True, kw_only=True)
    class Request:
        "Берет refresh token из cookie, валидирует его и выдает новый JWT в cookie."

        pass

    @dataclass(frozen=True, slots=True)
    class Ok:
        "JWT успешно обновлен\n\nset_cookie: Новый JWT установлен в cookie"

        body: _models.AuthSuccessResponse
        set_cookie: str | None = None

    @dataclass(slots=True)
    class Unauthorized(Exception):
        "Невалидный или истекший refresh token"

        pass

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

        body: _models.HttpValidationError

    type Response = Ok


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Обновить данные пользователя. Можно обновить имя, фамилию, отчество, активировать/деактивировать, разрешить смену пароля и выбрать список лицензий."
        ...


class AuthHandler(Protocol):
    async def login(self, request: Login.Request) -> Login.Response:
        "Авторизация\n\nАвторизует пользователя по email и паролю, выдает JWT и refresh token в cookie."
        ...

    async def logout(self, request: Logout.Request) -> Logout.Response:
        "Завершение сессии\n\nУдаляет access и refresh токены из Cookie"
        ...

    async def get_current_user(self, request: GetCurrentUser.Request) -> GetCurrentUser.Response:
        "Информация о текущем пользователе\n\nПолная информация о текущем пользователе с его доступными лицензиями"
        ...

    async def update_password(self, request: UpdatePassword.Request) -> UpdatePassword.Response:
        "Обновление пароля\n\nОбновляет пароль пользователя, если JWT валиден.\nВ ответе устанавливает новые JWT и refresh token в cookie.\n"
        ...

    async def request_password_reset(
        self, request: RequestPasswordReset.Request
    ) -> RequestPasswordReset.Response:
        "Запрос сброса пароля\n\nОтправляет на email ссылку для сброса пароля."
        ...

    async def reset_password(self, request: ResetPassword.Request) -> ResetPassword.Response:
        "Сброс пароля\n\nПринимает новый пароль и token из ссылки, сбрасывает пароль если token валиден."
        ...

    async def refresh_token(self, request: RefreshToken.Request) -> RefreshToken.Response:
        "Рефреш токена\n\nБерет refresh token из cookie, валидирует его и выдает новый JWT в cookie."
        ...


@dataclass(frozen=True, slots=True, kw_only=True)
class Handlers:
    admin: AdminHandler
    auth: AuthHandler
