# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/jwks/v1/keyapis_jwks_key_v1.proto, keyapis/jwks/v1/keyapis_jwks_system_v1.proto
# plugin: python-betterproto
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    Dict,
    List,
    Optional,
)

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


@dataclass(eq=False, repr=False)
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class KeyInfo(betterproto.Message):
    """Ключ. # Описание модели"""

    id: str = betterproto.string_field(1)
    """Идентификатор ключа, соответсвует kid. # Тип: Guid"""

    public_key: "KeyInfoPublicKey" = betterproto.message_field(2)
    """Публичный ключ"""

    created_at: datetime = betterproto.message_field(3)
    """Дата создания. # Тип: DateTime"""


@dataclass(eq=False, repr=False)
class KeyInfoPublicKey(betterproto.Message):
    """Публичный ключ"""

    use: str = betterproto.string_field(1)
    """Вид использования. # Диапазон: 2..32"""

    kty: str = betterproto.string_field(2)
    """Тип ключа. # Диапазон: 2..32"""

    kid: str = betterproto.string_field(3)
    """Идентификатор. # Тип: Guid"""

    alg: str = betterproto.string_field(4)
    """Алгоритм шифрования. # Диапазон: 2..32"""

    n: str = betterproto.string_field(5)
    """Параметр Modulus"""

    e: str = betterproto.string_field(6)
    """Параметр Exponent"""

    x5_c: List[str] = betterproto.string_field(7)
    """Цепочка сертификатов X.509. # Диапазон: 0..100"""


@dataclass(eq=False, repr=False)
class KeyInfoSavingError(betterproto.Message):
    """
    Ошибка сохранения. Эти проверки выполняются при работе с базой данных и
    сторонними сервисами
    """

    key_already_exists: "KeyInfoSavingErrorKeyAlreadyExists" = (
        betterproto.message_field(1, group="reason")
    )
    """Ключ с таким идентификатором уже существует"""


@dataclass(eq=False, repr=False)
class KeyInfoSavingErrorKeyAlreadyExists(betterproto.Message):
    """
    Ключ с таким идентификатором уже существует. Причины: - В базе хранится
    запись с переданнм kid
    """

    pass


@dataclass(eq=False, repr=False)
class PostKeyRequest(betterproto.Message):
    """Запрос на сохранение публичного ключа"""

    data: "KeyInfoPublicKey" = betterproto.message_field(1)
    """Ключ"""


@dataclass(eq=False, repr=False)
class PostKeyResponse(betterproto.Message):
    """Ответ на запрос на сохранение публичного ключа"""

    error: "PostKeyResponseError" = betterproto.message_field(1, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class PostKeyResponseError(betterproto.Message):
    """Ошибка"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибки валидации"""

    saving: "KeyInfoSavingError" = betterproto.message_field(2, group="reason")
    """Ошибка сохранения"""


@dataclass(eq=False, repr=False)
class DeleteKeyRequest(betterproto.Message):
    """Запрос удаления публичного ключа"""

    id: str = betterproto.string_field(1)
    """Идентификатор ключа, соответсвует kid. # Тип: Guid"""


@dataclass(eq=False, repr=False)
class DeleteKeyResponse(betterproto.Message):
    """Ответ на запрос удаления публичного ключа"""

    error: "DeleteKeyResponseError" = betterproto.message_field(1, group="type")
    """Ошибка"""


@dataclass(eq=False, repr=False)
class DeleteKeyResponseError(betterproto.Message):
    """Ошибка запроса удаления публичного ключа"""

    validation: "ValidationError" = betterproto.message_field(1, group="reason")
    """Ошибка валидации"""


@dataclass(eq=False, repr=False)
class GetKeyWellKnownJwksJsonRequest(betterproto.Message):
    """Запрос на получение публичных ключей"""

    pass


@dataclass(eq=False, repr=False)
class GetKeyWellKnownJwksJsonResponse(betterproto.Message):
    """Ответ на запрос на получение публичных ключей"""

    data: List["KeyInfoPublicKey"] = betterproto.message_field(1)
    """Список ключей"""


@dataclass(eq=False, repr=False)
class ValidationError(betterproto.Message):
    """
    Ошибки валидации. Эти проверки выполняются до обращения в базу данных
    """

    path: str = betterproto.string_field(1)
    """Путь к полю в формате наименования прото"""

    message: str = betterproto.string_field(2)
    """Валидационное сообщение"""


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.jwks.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class KeyServiceStub(betterproto.ServiceStub):
    async def post_key(
        self,
        post_key_request: "PostKeyRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostKeyResponse":
        return await self._unary_unary(
            "/keyapis.jwks.v1.KeyService/PostKey",
            post_key_request,
            PostKeyResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_key(
        self,
        delete_key_request: "DeleteKeyRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteKeyResponse":
        return await self._unary_unary(
            "/keyapis.jwks.v1.KeyService/DeleteKey",
            delete_key_request,
            DeleteKeyResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_key_well_known_jwks_json(
        self,
        get_key_well_known_jwks_json_request: "GetKeyWellKnownJwksJsonRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetKeyWellKnownJwksJsonResponse":
        return await self._unary_unary(
            "/keyapis.jwks.v1.KeyService/GetKeyWellKnownJwksJson",
            get_key_well_known_jwks_json_request,
            GetKeyWellKnownJwksJsonResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.jwks.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class KeyServiceBase(ServiceBase):

    async def post_key(self, post_key_request: "PostKeyRequest") -> "PostKeyResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_key(
        self, delete_key_request: "DeleteKeyRequest"
    ) -> "DeleteKeyResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_key_well_known_jwks_json(
        self, get_key_well_known_jwks_json_request: "GetKeyWellKnownJwksJsonRequest"
    ) -> "GetKeyWellKnownJwksJsonResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_key(
        self, stream: "grpclib.server.Stream[PostKeyRequest, PostKeyResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_key(request)
        await stream.send_message(response)

    async def __rpc_delete_key(
        self, stream: "grpclib.server.Stream[DeleteKeyRequest, DeleteKeyResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_key(request)
        await stream.send_message(response)

    async def __rpc_get_key_well_known_jwks_json(
        self,
        stream: "grpclib.server.Stream[GetKeyWellKnownJwksJsonRequest, GetKeyWellKnownJwksJsonResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_key_well_known_jwks_json(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.jwks.v1.KeyService/PostKey": grpclib.const.Handler(
                self.__rpc_post_key,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostKeyRequest,
                PostKeyResponse,
            ),
            "/keyapis.jwks.v1.KeyService/DeleteKey": grpclib.const.Handler(
                self.__rpc_delete_key,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteKeyRequest,
                DeleteKeyResponse,
            ),
            "/keyapis.jwks.v1.KeyService/GetKeyWellKnownJwksJson": grpclib.const.Handler(
                self.__rpc_get_key_well_known_jwks_json,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetKeyWellKnownJwksJsonRequest,
                GetKeyWellKnownJwksJsonResponse,
            ),
        }
