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

from dataclasses import dataclass
from typing import Protocol

from ..models import AuthSuccessResponse as _models_AuthSuccessResponse
from ..models import HttpValidationError as _models_HttpValidationError
from ..models import LoginRequest as _models_LoginRequest
from ..models import MessageResponse as _models_MessageResponse
from ..models import PasswordResetConfirmRequest as _models_PasswordResetConfirmRequest
from ..models import PasswordResetRequest as _models_PasswordResetRequest
from ..models import UpdatePasswordRequest as _models_UpdatePasswordRequest
from ..models import UserItem as _models_UserItem
from ._shared import Cookie


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 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."
        ...
