# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/iot_connect_sber/v1/keyapis_iot_connect_command_v1.proto, keyapis/iot_connect_sber/v1/keyapis_iot_connect_devices_v1.proto, keyapis/iot_connect_sber/v1/keyapis_iot_connect_unlink_v1.proto, keyapis/iot_connect_sber/v1/keyapis_iot_connect_user_v1.proto
# plugin: python-betterproto
# This file has been @generated

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 ModelFeatureType(betterproto.Enum):
    """Список функций устройства"""

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

    INCOMING_CALL = 1
    """Сигнализация о поступившем звонке"""

    ONLINE = 2
    """Сигнализация о доступности устройства"""

    REJECT_CALL = 3
    """Отклонение звонка"""

    UNLOCK = 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 DeviceStateKeyType(betterproto.Enum):
    """Список ключей статусов устройства"""

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

    ONLINE = 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 DeviceStateValueType(betterproto.Enum):
    """Тип значения статуса устройства"""

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

    BOOL = 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 DeviceCommandKeyType(betterproto.Enum):
    """Список ключей команд на изменение статуса устройства"""

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

    REJECT_CALL = 1
    """Отклонение звонка"""

    UNLOCK = 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 DeviceCommandValueType(betterproto.Enum):
    """Тип значения команд на изменение статуса устройства"""

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

    ENUM = 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 DeviceCommandValueValueEnumType(betterproto.Enum):
    """Значения команд на изменение статуса устройства типа перечисление"""

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

    REJECT = 1
    """Отклонение звонка"""

    UNLOCK = 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 GetUserRequest(betterproto.Message):
    """Запрос метода получения пользователя для соединения аккаунтов"""

    pass


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

    data: int = betterproto.int32_field(1)
    """Идентификатор пользователя"""


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

    pass


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Model(betterproto.Message):
    """Объект Модель устройства"""

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

    manufacturer: str = betterproto.string_field(2)
    """Производитель"""

    model: str = betterproto.string_field(3)
    """Название модели"""

    hw_version: str = betterproto.string_field(4)
    """Версия оборудования"""

    sw_version: str = betterproto.string_field(5)
    """Версия прошивки"""

    description: str = betterproto.string_field(6)
    """Описание"""

    category: str = betterproto.string_field(7)
    """Категория устройства"""

    feature_types: "list[ModelFeatureType]" = betterproto.enum_field(8)
    """Список функций"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class Device(betterproto.Message):
    """Объект устройства"""

    id: str = betterproto.string_field(1)
    """
    Идентификатор устройства на платформе Ключ.
     Конкатенация user_id и device_id плафтормы Ключ
    """

    name: str = betterproto.string_field(2)
    """Название устройства на платформе Ключ"""

    default_name: str = betterproto.string_field(3)
    """Название устройства от производителя"""

    home: str = betterproto.string_field(4)
    """Адрес дома, где установлено устройство"""

    room: str = betterproto.string_field(5)
    """Название или номер подъезда"""

    model: "Model" = betterproto.message_field(6)
    """Тип устройства"""

    hw_version: str = betterproto.string_field(7)
    """HW версия устройства"""

    sw_version: str = betterproto.string_field(8)
    """SW версия устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceStateArray(betterproto.Message):
    """Массив статусов устройства"""

    states: "list[DeviceState]" = betterproto.message_field(1)
    """Статусы устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceState(betterproto.Message):
    """Статус устройства"""

    state_key_type: "DeviceStateKeyType" = betterproto.enum_field(1)
    """Тип статуса устройства"""

    value: "DeviceStateValue" = betterproto.message_field(2)
    """Значение статуса устройства"""


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

    type: "DeviceStateValueType" = betterproto.enum_field(1)
    """Тип значения статуса устройства"""

    is_value: "bool | None" = betterproto.bool_field(2, optional=True, group="value")
    """Значение логического типа"""

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


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetDevicesRequest(betterproto.Message):
    """Запрос метода получения устройств, доступных пользователю"""

    pass


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

    data: "list[Device]" = betterproto.message_field(1)
    """Домофоны, доступные пользователю"""


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

    states: "list[DeviceCommand]" = betterproto.message_field(1)
    """Команды на изменение статуса устройства"""


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class DeviceCommand(betterproto.Message):
    """Команды на изменение статуса устройства"""

    command_key_type: "DeviceCommandKeyType" = betterproto.enum_field(1)
    """Тип команды на изменение статуса устройства"""

    value: "DeviceCommandValue" = betterproto.message_field(2)
    """Значение команды на изменение статуса устройства"""


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

    type: "DeviceCommandValueType" = betterproto.enum_field(1)
    """Тип значения команды на изменение статуса устройства"""

    value_enum_type: "DeviceCommandValueValueEnumType | None" = betterproto.enum_field(
        2, optional=True, group="value"
    )
    """Значения команды на изменение статуса устройства типа перечисление"""

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


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

    devices: "dict[str, DeviceCommandArray]" = betterproto.map_field(
        1, betterproto.TYPE_STRING, betterproto.TYPE_MESSAGE
    )
    """Массив домофонов со статусами"""


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

    pass


class UserServiceStub(betterproto.ServiceStub):
    async def get_user(
        self,
        get_user_request: "GetUserRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetUserResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect_sber.v1.UserService/GetUser",
            get_user_request,
            GetUserResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class UnlinkServiceStub(betterproto.ServiceStub):
    async def post_unlink(
        self,
        post_unlink_request: "PostUnlinkRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostUnlinkResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect_sber.v1.UnlinkService/PostUnlink",
            post_unlink_request,
            PostUnlinkResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class DevicesServiceStub(betterproto.ServiceStub):
    async def get_devices(
        self,
        get_devices_request: "GetDevicesRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetDevicesResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect_sber.v1.DevicesService/GetDevices",
            get_devices_request,
            GetDevicesResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CommandServiceStub(betterproto.ServiceStub):
    async def post_command(
        self,
        post_command_request: "PostCommandRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostCommandResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect_sber.v1.CommandService/PostCommand",
            post_command_request,
            PostCommandResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class UserServiceBase(ServiceBase):

    async def get_user(self, get_user_request: "GetUserRequest") -> "GetUserResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_user(
        self, stream: "grpclib.server.Stream[GetUserRequest, GetUserResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_user(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect_sber.v1.UserService/GetUser": grpclib.const.Handler(
                self.__rpc_get_user,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetUserRequest,
                GetUserResponse,
            ),
        }


class UnlinkServiceBase(ServiceBase):

    async def post_unlink(
        self, post_unlink_request: "PostUnlinkRequest"
    ) -> "PostUnlinkResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_unlink(
        self, stream: "grpclib.server.Stream[PostUnlinkRequest, PostUnlinkResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_unlink(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect_sber.v1.UnlinkService/PostUnlink": grpclib.const.Handler(
                self.__rpc_post_unlink,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostUnlinkRequest,
                PostUnlinkResponse,
            ),
        }


class DevicesServiceBase(ServiceBase):

    async def get_devices(
        self, get_devices_request: "GetDevicesRequest"
    ) -> "GetDevicesResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_devices(
        self, stream: "grpclib.server.Stream[GetDevicesRequest, GetDevicesResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_devices(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect_sber.v1.DevicesService/GetDevices": grpclib.const.Handler(
                self.__rpc_get_devices,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDevicesRequest,
                GetDevicesResponse,
            ),
        }


class CommandServiceBase(ServiceBase):

    async def post_command(
        self, post_command_request: "PostCommandRequest"
    ) -> "PostCommandResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_command(
        self, stream: "grpclib.server.Stream[PostCommandRequest, PostCommandResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_command(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect_sber.v1.CommandService/PostCommand": grpclib.const.Handler(
                self.__rpc_post_command,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostCommandRequest,
                PostCommandResponse,
            ),
        }


rebuild_dataclass(Model)  # type: ignore
rebuild_dataclass(Device)  # type: ignore
rebuild_dataclass(DeviceStateArray)  # type: ignore
rebuild_dataclass(DeviceState)  # type: ignore
rebuild_dataclass(DeviceStateValue)  # type: ignore
rebuild_dataclass(GetDevicesResponse)  # type: ignore
rebuild_dataclass(DeviceCommandArray)  # type: ignore
rebuild_dataclass(DeviceCommand)  # type: ignore
rebuild_dataclass(DeviceCommandValue)  # type: ignore
rebuild_dataclass(PostCommandRequest)  # type: ignore
