# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/preset/v1/keyapis_preset_events_v1.proto, keyapis/preset/v1/keyapis_preset_preset_v1.proto, keyapis/preset/v1/keyapis_preset_system_v1.proto
# plugin: python-betterproto
# This file has been @generated

from collections.abc import AsyncIterator
from datetime import datetime
from typing import TYPE_CHECKING

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase
from pydantic import model_validator
from pydantic.dataclasses import (
    dataclass,
    rebuild_dataclass,
)

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


class PresetStatusType(betterproto.Enum):
    """
    Справочник статусов.
     # Тип: byte
    """

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

    ACTIVE = 1
    """Активный"""

    ARCHIVE = 2
    """Архивный"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PresetSyslogProtocolType(betterproto.Enum):
    """
    Тип протокола.
     # Тип: byte
    """

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

    UDP = 1
    """Протокол UDP"""

    TCP = 2
    """Протокол TCP"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

    HIGH = 1
    """Высокое качество"""

    MEDIUM = 2
    """Среднее качество"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


class PresetFaceRecognitionConfigurationType(betterproto.Enum):
    """Тип конфигурации"""

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

    DEFAULT = 1
    """По умолчанию"""

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

    CREATED_AT = 2
    """По времени создания"""

    CHANGED_AT = 3
    """По времени изменения"""

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Preset(betterproto.Message):
    """
    Пресет.
     Пресет с id=1 является дефолтным пресетом.
     # Описание модели
    """

    id: int = betterproto.int32_field(1)
    """
    Идентификатор.
     # Диапазон: 0..2147483647
    """

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

    mrf_ids: "list[int]" = betterproto.int32_field(3)
    """
    Идентификатор МРФ.
     # Диапазон: 0..10
    """

    rf_ids: "list[int]" = betterproto.int32_field(4)
    """
    Идентификатор РФ.
     # Диапазон: 0..100
    """

    description: "str | None" = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """
    Описание.
     # Диапазон: 3..1024
    """

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

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

    status_type: "PresetStatusType" = betterproto.enum_field(8)
    """Статус"""

    sip: "PresetSip" = betterproto.message_field(9)
    """Параметр SIP"""

    ntp: "PresetNtp" = betterproto.message_field(10)
    """Параметр NTP"""

    syslog: "PresetSyslog" = betterproto.message_field(11)
    """Параметр Syslog"""

    rooms: "list[PresetRoom]" = betterproto.message_field(12)
    """
    Помещения.
     # Диапазон: 0..10000
    """

    video_config: "PresetVideoConfig" = betterproto.message_field(13)
    """Параметры конфигурации видео"""

    dtmf: "list[PresetDtmf]" = betterproto.message_field(14)
    """
    Параметр DTMF.
     # Диапазон: 0..64
    """

    face_recognition: "PresetFaceRecognition" = betterproto.message_field(15)
    """Распознование лиц"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSip(betterproto.Message):
    """Параметр SIP"""

    host: str = betterproto.string_field(1)
    """
    Хост.
     # Диапазон: 5..256
    """

    port: int = betterproto.int32_field(2)
    """
    Порт.
     # Диапазон: 1..65536
    """

    reg_host: str = betterproto.string_field(3)
    """
    Хост reg.
     # Диапазон: 5..256
    """

    reg_port: int = betterproto.int32_field(4)
    """
    Порт reg.
     # Диапазон: 1..65536
    """

    proxy_host: str = betterproto.string_field(5)
    """
    Хост proxy.
     # Диапазон: 5..256
    """

    proxy_port: int = betterproto.int32_field(6)
    """
    Порт proxy.
     # Диапазон: 1..65536
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetNtp(betterproto.Message):
    """Параметр NTP"""

    host: str = betterproto.string_field(1)
    """
    Хост.
     # Диапазон: 5..256
    """

    port: int = betterproto.int32_field(2)
    """
    Порт.
     # Диапазон: 1..65536
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSyslog(betterproto.Message):
    """Параметр Syslog"""

    host: str = betterproto.string_field(1)
    """
    Хост.
     # Диапазон: 5..256
    """

    port: int = betterproto.int32_field(2)
    """
    Порт.
     # Диапазон: 1..65536
    """

    protocol_type: "PresetSyslogProtocolType" = betterproto.enum_field(3)
    """Протокол"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetRoom(betterproto.Message):
    """Помещение"""

    phone: str = betterproto.string_field(1)
    """
    Номер телефона.
     # Диапазон: 5..14
    """

    num: int = betterproto.int32_field(2)
    """
    Номер помещения.
     # Диапазон: 1..10000
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetVideoConfig(betterproto.Message):
    """Параметры конфигурации видео"""

    quality_type: "PresetVideoConfigQualityType" = betterproto.enum_field(1)
    """Тип пресета"""

    rtsp_user: "PresetVideoConfigRtspUser" = betterproto.message_field(2)
    """Пользователь"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetVideoConfigRtspUser(betterproto.Message):
    """Пользователь"""

    username: str = betterproto.string_field(1)
    """
    Имя пользователя.
     # Диапазон: 3..256
    """

    password: str = betterproto.string_field(2)
    """
    Пароль.
     # Диапазон: 3..256
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetDtmf(betterproto.Message):
    """Параметр DTMF"""

    code: str = betterproto.string_field(1)
    """
    Код.
     # Диапазон: 1..1
    """

    relay_index: int = betterproto.int32_field(2)
    """
    Индекс реле.
     # Диапазон: 0..64
    """


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetFaceRecognition(betterproto.Message):
    """Распознование лиц"""

    host: str = betterproto.string_field(1)
    """Адрес"""

    alt_host: str = betterproto.string_field(2)
    """Альтернативный адрес"""

    endpoint: str = betterproto.string_field(3)
    """Путь запроса к серверу"""

    auth_token: str = betterproto.string_field(4)
    """Токен"""

    configuration_type: "PresetFaceRecognitionConfigurationType" = (
        betterproto.enum_field(5)
    )
    """Тип конфигурации"""

    origin_id: str = betterproto.string_field(6)
    """Идентификатор источника в identix"""

    group_ids: "list[int]" = betterproto.int32_field(7)
    """Идентификаторы групп профилей в identix"""


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

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

    not_allowed_for_default: "PresetSavingErrorNotAllowedForDefault | None" = (
        betterproto.message_field(2, optional=True, group="reason")
    )
    """Запрещено для дефолтного пресета"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetSavingErrorNotAllowedForDefault(betterproto.Message):
    """
    Недоступно для дефолтного пресета.
     Причины:
     - Смена статуса на Архивный
    """

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPresetRequest(betterproto.Message):
    """Запрос на создание/изменение пресета"""

    data: "Preset" = betterproto.message_field(1)
    """Пресет"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPresetResponse(betterproto.Message):
    """Ответ на запрос на создание/изменение пресета"""

    data: "Preset | None" = betterproto.message_field(1, optional=True, group="type")
    """Пресет"""

    error: "PostPresetResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostPresetResponseError(betterproto.Message):
    """Ошибка запроса сохранения пресета"""

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetListRequest(betterproto.Message):
    """Запрос на получение списка пресетов"""

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetRequest(betterproto.Message):
    """Запрос получения пресета"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetResponse(betterproto.Message):
    """Ответ на запрос получения пресета"""

    data: "Preset | None" = betterproto.message_field(1, optional=True, group="type")
    """Пресет"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetDefaultRequest(betterproto.Message):
    """Запрос получения дефолтного пресета"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetDefaultResponse(betterproto.Message):
    """Ответ на запрос получения дефолтного пресета"""

    data: "Preset | None" = betterproto.message_field(1, optional=True, group="type")
    """Пресет"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetListResponse(betterproto.Message):
    """Ответ на получение списка пресетов"""

    data: "Preset | None" = betterproto.message_field(1, optional=True, group="type")
    """Пресет"""

    error: "GetPresetListResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetListResponseError(betterproto.Message):
    """Ошибка запроса получения списка пресетов"""

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetCountRequest(betterproto.Message):
    """Запрос получения количества пресетов"""

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


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetCountResponse(betterproto.Message):
    """Ответ на запрос получения количества пресетов"""

    data: "int | None" = betterproto.int32_field(1, optional=True, group="type")
    """Всего пресетов"""

    error: "GetPresetCountResponseError | None" = betterproto.message_field(
        2, optional=True, group="type"
    )
    """Ошибка"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetPresetCountResponseError(betterproto.Message):
    """Ошибка запроса получения количества пресетов"""

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeletePresetRequest(betterproto.Message):
    """Запрос удаления пресета"""

    id: int = betterproto.int32_field(1)
    """Идентификатор пресета"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeletePresetResponse(betterproto.Message):
    """Ответ на запрос удаления пресета"""

    error: "DeletePresetResponseError | None" = betterproto.message_field(
        1, optional=True, group="type"
    )
    """Ошибка при удалении"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeletePresetResponseError(betterproto.Message):
    """Ошибка при удалении"""

    not_allowed_for_default: "DeletePresetResponseErrorNotAllowedForDefault | None" = (
        betterproto.message_field(1, optional=True, group="reason")
    )
    """Запрещено для дефолтного пресета"""

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeletePresetResponseErrorNotAllowedForDefault(betterproto.Message):
    """Недоступно для дефолтного пресета"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetFilter(betterproto.Message):
    """Фильтр по пресетам"""

    mrf_ids: "list[int]" = betterproto.int32_field(1)
    """По идентификаторам МРФ"""

    rf_ids: "list[int]" = betterproto.int32_field(2)
    """По идентификаторам РФ"""

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

    title: "str | None" = betterproto.message_field(4, wraps=betterproto.TYPE_STRING)
    """
    Поиск по наименованию.
     Если значение не передано то поиск по нему не производится.
     # Диапазон: 3..64.
     # Поиск производится по полям:
     # - Наименование
    """

    status_types: "list[PresetStatusType]" = betterproto.enum_field(5)
    """По статусам"""


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

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

    direction_type: "PresetPagingDirectionType" = 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, config={"extra": "forbid"})
class ValidationError(betterproto.Message):
    """
    Ошибки валидации.
     Эти проверки выполняются до обращения в базу данных
    """

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

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


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

    pass


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostEventPresetInstallRequest(betterproto.Message):
    """Запрос на установку пресета"""

    id: int = betterproto.int32_field(1)
    """Идентификатор пресета"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostEventPresetInstallResponse(betterproto.Message):
    """Ответ на запрос на установку пресета"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetConfigurationTask(betterproto.Message):
    """
    Задача на конфигурирование устройства.
     Очередь key.preset.configuration
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    preset: "Preset" = betterproto.message_field(2)
    """Пресет"""

    device_id: int = betterproto.int32_field(3)
    """Идентификатор устройства"""

    model: str = betterproto.string_field(4)
    """Модель"""

    host: str = betterproto.string_field(5)
    """Адрес устройства"""

    username: str = betterproto.string_field(6)
    """Имя пользователя устройства"""

    password: str = betterproto.string_field(7)
    """Пароль пользователья устройства"""

    ntp_timezone: str = betterproto.string_field(8)
    """Таймзона NTP"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetConfigurationSuccessTask(betterproto.Message):
    """
    Задача успешной конфигурации устройства.
     Очередь key.preset.configuration_success
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор ответа"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    preset_id: int = betterproto.int32_field(3)
    """Идентификатор пресета"""

    configured_at: datetime = betterproto.message_field(4)
    """Дата и время конфигурации"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetConfigurationFailTask(betterproto.Message):
    """
    Задача ошибки при конфигурации устройства.
     Очередь key.preset.configuration_fail
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор ответа"""

    device_id: int = betterproto.int32_field(2)
    """Идентификатор устройства"""

    preset_id: int = betterproto.int32_field(3)
    """Идентификатор пресета"""

    error_message: str = betterproto.string_field(4)
    """Текст ошибки"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PresetInstallTask(betterproto.Message):
    """
    Задача на установку пресета.
     Очередь key.preset.install
    """

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    preset: "Preset" = betterproto.message_field(2)
    """Пресет"""


class PresetServiceStub(betterproto.ServiceStub):
    async def post_preset(
        self,
        post_preset_request: "PostPresetRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostPresetResponse":
        return await self._unary_unary(
            "/keyapis.preset.v1.PresetService/PostPreset",
            post_preset_request,
            PostPresetResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_preset(
        self,
        get_preset_request: "GetPresetRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetPresetResponse":
        return await self._unary_unary(
            "/keyapis.preset.v1.PresetService/GetPreset",
            get_preset_request,
            GetPresetResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_preset_default(
        self,
        get_preset_default_request: "GetPresetDefaultRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetPresetDefaultResponse":
        return await self._unary_unary(
            "/keyapis.preset.v1.PresetService/GetPresetDefault",
            get_preset_default_request,
            GetPresetDefaultResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_preset_list(
        self,
        get_preset_list_request: "GetPresetListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "AsyncIterator[GetPresetListResponse]":
        async for response in self._unary_stream(
            "/keyapis.preset.v1.PresetService/GetPresetList",
            get_preset_list_request,
            GetPresetListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_preset_count(
        self,
        get_preset_count_request: "GetPresetCountRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetPresetCountResponse":
        return await self._unary_unary(
            "/keyapis.preset.v1.PresetService/GetPresetCount",
            get_preset_count_request,
            GetPresetCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def delete_preset(
        self,
        delete_preset_request: "DeletePresetRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "DeletePresetResponse":
        return await self._unary_unary(
            "/keyapis.preset.v1.PresetService/DeletePreset",
            delete_preset_request,
            DeletePresetResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


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


class EventServiceStub(betterproto.ServiceStub):
    async def post_event_preset_install(
        self,
        post_event_preset_install_request: "PostEventPresetInstallRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostEventPresetInstallResponse":
        return await self._unary_unary(
            "/keyapis.preset.v1.EventService/PostEventPresetInstall",
            post_event_preset_install_request,
            PostEventPresetInstallResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class PresetServiceBase(ServiceBase):

    async def post_preset(
        self, post_preset_request: "PostPresetRequest"
    ) -> "PostPresetResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_preset(
        self, get_preset_request: "GetPresetRequest"
    ) -> "GetPresetResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_preset_default(
        self, get_preset_default_request: "GetPresetDefaultRequest"
    ) -> "GetPresetDefaultResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_preset_list(
        self, get_preset_list_request: "GetPresetListRequest"
    ) -> "AsyncIterator[GetPresetListResponse]":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
        yield GetPresetListResponse()

    async def get_preset_count(
        self, get_preset_count_request: "GetPresetCountRequest"
    ) -> "GetPresetCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def delete_preset(
        self, delete_preset_request: "DeletePresetRequest"
    ) -> "DeletePresetResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_preset(
        self, stream: "grpclib.server.Stream[PostPresetRequest, PostPresetResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_preset(request)
        await stream.send_message(response)

    async def __rpc_get_preset(
        self, stream: "grpclib.server.Stream[GetPresetRequest, GetPresetResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_preset(request)
        await stream.send_message(response)

    async def __rpc_get_preset_default(
        self,
        stream: "grpclib.server.Stream[GetPresetDefaultRequest, GetPresetDefaultResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_preset_default(request)
        await stream.send_message(response)

    async def __rpc_get_preset_list(
        self,
        stream: "grpclib.server.Stream[GetPresetListRequest, GetPresetListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_preset_list,
            stream,
            request,
        )

    async def __rpc_get_preset_count(
        self,
        stream: "grpclib.server.Stream[GetPresetCountRequest, GetPresetCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_preset_count(request)
        await stream.send_message(response)

    async def __rpc_delete_preset(
        self, stream: "grpclib.server.Stream[DeletePresetRequest, DeletePresetResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.delete_preset(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.preset.v1.PresetService/PostPreset": grpclib.const.Handler(
                self.__rpc_post_preset,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostPresetRequest,
                PostPresetResponse,
            ),
            "/keyapis.preset.v1.PresetService/GetPreset": grpclib.const.Handler(
                self.__rpc_get_preset,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPresetRequest,
                GetPresetResponse,
            ),
            "/keyapis.preset.v1.PresetService/GetPresetDefault": grpclib.const.Handler(
                self.__rpc_get_preset_default,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPresetDefaultRequest,
                GetPresetDefaultResponse,
            ),
            "/keyapis.preset.v1.PresetService/GetPresetList": grpclib.const.Handler(
                self.__rpc_get_preset_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetPresetListRequest,
                GetPresetListResponse,
            ),
            "/keyapis.preset.v1.PresetService/GetPresetCount": grpclib.const.Handler(
                self.__rpc_get_preset_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetPresetCountRequest,
                GetPresetCountResponse,
            ),
            "/keyapis.preset.v1.PresetService/DeletePreset": grpclib.const.Handler(
                self.__rpc_delete_preset,
                grpclib.const.Cardinality.UNARY_UNARY,
                DeletePresetRequest,
                DeletePresetResponse,
            ),
        }


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.preset.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }


class EventServiceBase(ServiceBase):

    async def post_event_preset_install(
        self, post_event_preset_install_request: "PostEventPresetInstallRequest"
    ) -> "PostEventPresetInstallResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_event_preset_install(
        self,
        stream: "grpclib.server.Stream[PostEventPresetInstallRequest, PostEventPresetInstallResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_event_preset_install(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.preset.v1.EventService/PostEventPresetInstall": grpclib.const.Handler(
                self.__rpc_post_event_preset_install,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostEventPresetInstallRequest,
                PostEventPresetInstallResponse,
            ),
        }


rebuild_dataclass(Preset)  # type: ignore
rebuild_dataclass(PresetSyslog)  # type: ignore
rebuild_dataclass(PresetVideoConfig)  # type: ignore
rebuild_dataclass(PresetFaceRecognition)  # type: ignore
rebuild_dataclass(PresetSavingError)  # type: ignore
rebuild_dataclass(PostPresetRequest)  # type: ignore
rebuild_dataclass(PostPresetResponse)  # type: ignore
rebuild_dataclass(PostPresetResponseError)  # type: ignore
rebuild_dataclass(GetPresetListRequest)  # type: ignore
rebuild_dataclass(GetPresetResponse)  # type: ignore
rebuild_dataclass(GetPresetDefaultResponse)  # type: ignore
rebuild_dataclass(GetPresetListResponse)  # type: ignore
rebuild_dataclass(GetPresetListResponseError)  # type: ignore
rebuild_dataclass(GetPresetCountRequest)  # type: ignore
rebuild_dataclass(GetPresetCountResponse)  # type: ignore
rebuild_dataclass(GetPresetCountResponseError)  # type: ignore
rebuild_dataclass(DeletePresetResponse)  # type: ignore
rebuild_dataclass(DeletePresetResponseError)  # type: ignore
rebuild_dataclass(PresetFilter)  # type: ignore
rebuild_dataclass(PresetPaging)  # type: ignore
rebuild_dataclass(PresetConfigurationTask)  # type: ignore
rebuild_dataclass(PresetConfigurationSuccessTask)  # type: ignore
rebuild_dataclass(PresetInstallTask)  # type: ignore
