# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/encryption_profile/v1/keyapis_encryption_profile_encryption_profile_v1.proto, keyapis/encryption_profile/v1/keyapis_encryption_profile_system_v1.proto
# plugin: python-betterproto
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterator,
    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


class EncryptionProfileType(betterproto.Enum):
    """Справочник типов профиля шифрования. # Тип: byte"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    SL3 = 1
    """Тип SL3"""


class EncryptionProfilePagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки. # Тип: byte"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    CHANGED_AT = 2
    """Дата последнего изменения"""

    CREATED_AT = 3
    """Дата создания"""

    RANK = 4
    """
    По рангу для поиска по тексту. Применяется когда передано поле для поиска
    по тексту. В случае если текстовое поле не передано, применяется значение
    по умолчанию
    """


class EncryptionProfilePagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки; # Тип: byte"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


@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 EncryptionProfile(betterproto.Message):
    """Профиль шифрования. # Описание модели"""

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

    name: str = betterproto.string_field(2)
    """Наименование. # Диапазон: 3..64"""

    description: Optional[str] = betterproto.message_field(
        3, wraps=betterproto.TYPE_STRING
    )
    """Описание. # Диапазон: 3..1000"""

    type: "EncryptionProfileType" = betterproto.enum_field(4)
    """Тип профиля шифрования"""

    sector_number: int = betterproto.int32_field(5)
    """Номер сектора. # Диапазон: 0..15"""

    block_number: int = betterproto.int32_field(6)
    """Номер блока. # Диапазон: 0..3"""

    start_index: int = betterproto.int32_field(7)
    """Индекс первого символа для секрета. # Диапазон: 0..31"""

    end_index: int = betterproto.int32_field(8)
    """Индекс последнего символа для секрета. # Диапазон: 0..31"""

    secret_a: str = betterproto.string_field(9)
    """Пароль A профиля. # Диапазон: 16..32"""

    encrypted_secret_a: str = betterproto.string_field(10)
    """Зашифрованный пароль B профиля"""

    secret_b: str = betterproto.string_field(11)
    """Пароль B профиля. # Диапазон: 16..32"""

    encrypted_secret_b: str = betterproto.string_field(12)
    """Зашифрованный пароль B профиля"""

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

    changed_at: datetime = betterproto.message_field(14)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта. # Тип: DateTime
    """

    deleted_at: datetime = betterproto.message_field(15)
    """Дата удаления. # Тип: DateTime?"""


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

    conflict: "EncryptionProfileSavingErrorConflict" = betterproto.message_field(
        1, group="reason"
    )
    """Конфликт версий"""

    range_is_too_small: "EncryptionProfileSavingErrorRangeIsTooSmall" = (
        betterproto.message_field(2, group="reason")
    )
    """Указанный диапазон не соответствует минимальному значению"""


@dataclass(eq=False, repr=False)
class EncryptionProfileSavingErrorConflict(betterproto.Message):
    """
    Конфликт версий. Причины: - В базе хранится другая версия строки, значения
    changed_at оличаются
    """

    pass


@dataclass(eq=False, repr=False)
class EncryptionProfileSavingErrorRangeIsTooSmall(betterproto.Message):
    """
    Указанный диапазон не соответствует минимальному значению. Причины: -
    Модуль разности между полями start_index и end_index меньше 7
    """

    pass


@dataclass(eq=False, repr=False)
class EncryptionProfileFilter(betterproto.Message):
    """Фильтр по профилям шифрования"""

    text: str = betterproto.string_field(1)
    """
    Поиск по тексту. Если значение не передано то поиск по нему не
    производится. # Диапазон: 3..64. # Поиск производится по полям: # -
    Наименование; # - Описание
    """

    types: List["EncryptionProfileType"] = betterproto.enum_field(2)
    """По типам профиля шифрования"""

    show_deleted: Optional[bool] = betterproto.message_field(
        3, wraps=betterproto.TYPE_BOOL
    )
    """Показывать удаленные"""


@dataclass(eq=False, repr=False)
class EncryptionProfilePaging(betterproto.Message):
    """Постраничный вывод"""

    order_by_type: "EncryptionProfilePagingOrderByType" = betterproto.enum_field(1)
    """
    Тип значения сортировки. Если значение не передано, то будет взято значение
    по умолчанию. # По умолчанию: CHANGED_AT
    """

    direction_type: "EncryptionProfilePagingDirectionType" = betterproto.enum_field(2)
    """Тип направления сортировки. # По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Если значение 0 (не передано), то будет
    взято значение по умолчанию. # Диапазон: 0..100. # По умолчанию: 20
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. # Диапазон: 0..2147483647"""


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

    data: "EncryptionProfile" = betterproto.message_field(1)
    """Профиль шифрования"""


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

    data: "EncryptionProfile" = betterproto.message_field(1, group="type")
    """Профиль шифрования"""

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


@dataclass(eq=False, repr=False)
class PostEncryptionProfileResponseError(betterproto.Message):
    """Ошибка запроса сохранения профиля шифрования"""

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

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


@dataclass(eq=False, repr=False)
class GetEncryptionProfileListRequest(betterproto.Message):
    """Запрос на получение списка профилей шифрования"""

    filter: "EncryptionProfileFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "EncryptionProfilePaging" = betterproto.message_field(2, group="pagination")
    """Стандартный постраничный вывод"""


@dataclass(eq=False, repr=False)
class GetEncryptionProfileListResponse(betterproto.Message):
    """Ответ на получение списка профилей шифрования"""

    data: "EncryptionProfile" = betterproto.message_field(1, group="type")
    """Профиль шифрования"""

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


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

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


@dataclass(eq=False, repr=False)
class GetEncryptionProfileRequest(betterproto.Message):
    """Запрос получения профиля шифрования"""

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


@dataclass(eq=False, repr=False)
class GetEncryptionProfileResponse(betterproto.Message):
    """Ответ на запрос получения профиля шифрования"""

    data: "EncryptionProfile" = betterproto.message_field(1, group="type")
    """Профиль шифрования"""

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


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

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


@dataclass(eq=False, repr=False)
class GetEncryptionProfileCountRequest(betterproto.Message):
    """Запрос получения количества профилей шифрования"""

    filter: "EncryptionProfileFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False)
class GetEncryptionProfileCountResponse(betterproto.Message):
    """Ответ на запрос получения количества профилей шифрования"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего устройтсв"""

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


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

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


@dataclass(eq=False, repr=False)
class DeleteEncryptionProfileRequest(betterproto.Message):
    """Запрос удаления профиля шифрования"""

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


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

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


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

    linked_devices_exists: "DeleteEncryptionProfileResponseErrorLinkedDevicesExists" = (
        betterproto.message_field(1, group="reason")
    )
    """Существуют устройства, связанные с этим профилем шифрования"""


@dataclass(eq=False, repr=False)
class DeleteEncryptionProfileResponseErrorLinkedDevicesExists(betterproto.Message):
    """
    Существуют устройства, связанные с этим профилем шифрования. Следует
    отвязать устройства перед удалением профиля
    """

    pass


@dataclass(eq=False, repr=False)
class PostEncryptionProfileRestoreRequest(betterproto.Message):
    """Запрос разархивации шифрования по идентификатору"""

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


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

    pass


@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.encryption_profile.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class EncryptionProfileServiceStub(betterproto.ServiceStub):
    async def post_encryption_profile(
        self,
        post_encryption_profile_request: "PostEncryptionProfileRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostEncryptionProfileResponse":
        return await self._unary_unary(
            "/keyapis.encryption_profile.v1.EncryptionProfileService/PostEncryptionProfile",
            post_encryption_profile_request,
            PostEncryptionProfileResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_encryption_profile(
        self,
        get_encryption_profile_request: "GetEncryptionProfileRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetEncryptionProfileResponse":
        return await self._unary_unary(
            "/keyapis.encryption_profile.v1.EncryptionProfileService/GetEncryptionProfile",
            get_encryption_profile_request,
            GetEncryptionProfileResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_encryption_profile_list(
        self,
        get_encryption_profile_list_request: "GetEncryptionProfileListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetEncryptionProfileListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.encryption_profile.v1.EncryptionProfileService/GetEncryptionProfileList",
            get_encryption_profile_list_request,
            GetEncryptionProfileListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_encryption_profile_count(
        self,
        get_encryption_profile_count_request: "GetEncryptionProfileCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetEncryptionProfileCountResponse":
        return await self._unary_unary(
            "/keyapis.encryption_profile.v1.EncryptionProfileService/GetEncryptionProfileCount",
            get_encryption_profile_count_request,
            GetEncryptionProfileCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_encryption_profile(
        self,
        delete_encryption_profile_request: "DeleteEncryptionProfileRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "DeleteEncryptionProfileResponse":
        return await self._unary_unary(
            "/keyapis.encryption_profile.v1.EncryptionProfileService/DeleteEncryptionProfile",
            delete_encryption_profile_request,
            DeleteEncryptionProfileResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_encryption_profile_restore(
        self,
        post_encryption_profile_restore_request: "PostEncryptionProfileRestoreRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostEncryptionProfileRestoreResponse":
        return await self._unary_unary(
            "/keyapis.encryption_profile.v1.EncryptionProfileService/PostEncryptionProfileRestore",
            post_encryption_profile_restore_request,
            PostEncryptionProfileRestoreResponse,
            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.encryption_profile.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class EncryptionProfileServiceBase(ServiceBase):

    async def post_encryption_profile(
        self, post_encryption_profile_request: "PostEncryptionProfileRequest"
    ) -> "PostEncryptionProfileResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_encryption_profile(
        self, get_encryption_profile_request: "GetEncryptionProfileRequest"
    ) -> "GetEncryptionProfileResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_encryption_profile_list(
        self, get_encryption_profile_list_request: "GetEncryptionProfileListRequest"
    ) -> AsyncIterator["GetEncryptionProfileListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_encryption_profile_count(
        self, get_encryption_profile_count_request: "GetEncryptionProfileCountRequest"
    ) -> "GetEncryptionProfileCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_encryption_profile(
        self, delete_encryption_profile_request: "DeleteEncryptionProfileRequest"
    ) -> "DeleteEncryptionProfileResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_encryption_profile_restore(
        self,
        post_encryption_profile_restore_request: "PostEncryptionProfileRestoreRequest",
    ) -> "PostEncryptionProfileRestoreResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_encryption_profile(
        self,
        stream: "grpclib.server.Stream[PostEncryptionProfileRequest, PostEncryptionProfileResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_encryption_profile(request)
        await stream.send_message(response)

    async def __rpc_get_encryption_profile(
        self,
        stream: "grpclib.server.Stream[GetEncryptionProfileRequest, GetEncryptionProfileResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_encryption_profile(request)
        await stream.send_message(response)

    async def __rpc_get_encryption_profile_list(
        self,
        stream: "grpclib.server.Stream[GetEncryptionProfileListRequest, GetEncryptionProfileListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_encryption_profile_list,
            stream,
            request,
        )

    async def __rpc_get_encryption_profile_count(
        self,
        stream: "grpclib.server.Stream[GetEncryptionProfileCountRequest, GetEncryptionProfileCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_encryption_profile_count(request)
        await stream.send_message(response)

    async def __rpc_delete_encryption_profile(
        self,
        stream: "grpclib.server.Stream[DeleteEncryptionProfileRequest, DeleteEncryptionProfileResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_encryption_profile(request)
        await stream.send_message(response)

    async def __rpc_post_encryption_profile_restore(
        self,
        stream: "grpclib.server.Stream[PostEncryptionProfileRestoreRequest, PostEncryptionProfileRestoreResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_encryption_profile_restore(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.encryption_profile.v1.EncryptionProfileService/PostEncryptionProfile": grpclib.const.Handler(
                self.__rpc_post_encryption_profile,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostEncryptionProfileRequest,
                PostEncryptionProfileResponse,
            ),
            "/keyapis.encryption_profile.v1.EncryptionProfileService/GetEncryptionProfile": grpclib.const.Handler(
                self.__rpc_get_encryption_profile,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetEncryptionProfileRequest,
                GetEncryptionProfileResponse,
            ),
            "/keyapis.encryption_profile.v1.EncryptionProfileService/GetEncryptionProfileList": grpclib.const.Handler(
                self.__rpc_get_encryption_profile_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetEncryptionProfileListRequest,
                GetEncryptionProfileListResponse,
            ),
            "/keyapis.encryption_profile.v1.EncryptionProfileService/GetEncryptionProfileCount": grpclib.const.Handler(
                self.__rpc_get_encryption_profile_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetEncryptionProfileCountRequest,
                GetEncryptionProfileCountResponse,
            ),
            "/keyapis.encryption_profile.v1.EncryptionProfileService/DeleteEncryptionProfile": grpclib.const.Handler(
                self.__rpc_delete_encryption_profile,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeleteEncryptionProfileRequest,
                DeleteEncryptionProfileResponse,
            ),
            "/keyapis.encryption_profile.v1.EncryptionProfileService/PostEncryptionProfileRestore": grpclib.const.Handler(
                self.__rpc_post_encryption_profile_restore,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostEncryptionProfileRestoreRequest,
                PostEncryptionProfileRestoreResponse,
            ),
        }
