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

    pass


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

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


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class PostV1UnlinkResponse(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 GetV1DevicesRequest(betterproto.Message):
    """Запрос метода получения устройств, доступных пользователю"""

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
class GetV1DevicesResponse(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 PostV1CommandRequest(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 PostV1CommandResponse(betterproto.Message):
    """Ответ на запрос на изменение состояния устройства"""

    pass


class UserServiceStub(betterproto.ServiceStub):
    async def get_v1_user(
        self,
        get_v1_user_request: "GetV1UserRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetV1UserResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect.sber.v1.UserService/GetV1User",
            get_v1_user_request,
            GetV1UserResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class UnlinkServiceStub(betterproto.ServiceStub):
    async def post_v1_unlink(
        self,
        post_v1_unlink_request: "PostV1UnlinkRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostV1UnlinkResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect.sber.v1.UnlinkService/PostV1Unlink",
            post_v1_unlink_request,
            PostV1UnlinkResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class DevicesServiceStub(betterproto.ServiceStub):
    async def get_v1_devices(
        self,
        get_v1_devices_request: "GetV1DevicesRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "GetV1DevicesResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect.sber.v1.DevicesService/GetV1Devices",
            get_v1_devices_request,
            GetV1DevicesResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class CommandServiceStub(betterproto.ServiceStub):
    async def post_v1_command(
        self,
        post_v1_command_request: "PostV1CommandRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = None
    ) -> "PostV1CommandResponse":
        return await self._unary_unary(
            "/keyapis.iot_connect.sber.v1.CommandService/PostV1Command",
            post_v1_command_request,
            PostV1CommandResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class UserServiceBase(ServiceBase):

    async def get_v1_user(
        self, get_v1_user_request: "GetV1UserRequest"
    ) -> "GetV1UserResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_v1_user(
        self, stream: "grpclib.server.Stream[GetV1UserRequest, GetV1UserResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_v1_user(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect.sber.v1.UserService/GetV1User": grpclib.const.Handler(
                self.__rpc_get_v1_user,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetV1UserRequest,
                GetV1UserResponse,
            ),
        }


class UnlinkServiceBase(ServiceBase):

    async def post_v1_unlink(
        self, post_v1_unlink_request: "PostV1UnlinkRequest"
    ) -> "PostV1UnlinkResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_v1_unlink(
        self, stream: "grpclib.server.Stream[PostV1UnlinkRequest, PostV1UnlinkResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_v1_unlink(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect.sber.v1.UnlinkService/PostV1Unlink": grpclib.const.Handler(
                self.__rpc_post_v1_unlink,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostV1UnlinkRequest,
                PostV1UnlinkResponse,
            ),
        }


class DevicesServiceBase(ServiceBase):

    async def get_v1_devices(
        self, get_v1_devices_request: "GetV1DevicesRequest"
    ) -> "GetV1DevicesResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_v1_devices(
        self, stream: "grpclib.server.Stream[GetV1DevicesRequest, GetV1DevicesResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_v1_devices(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect.sber.v1.DevicesService/GetV1Devices": grpclib.const.Handler(
                self.__rpc_get_v1_devices,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetV1DevicesRequest,
                GetV1DevicesResponse,
            ),
        }


class CommandServiceBase(ServiceBase):

    async def post_v1_command(
        self, post_v1_command_request: "PostV1CommandRequest"
    ) -> "PostV1CommandResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_v1_command(
        self,
        stream: "grpclib.server.Stream[PostV1CommandRequest, PostV1CommandResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_v1_command(request)
        await stream.send_message(response)

    def __mapping__(self) -> "dict[str, grpclib.const.Handler]":
        return {
            "/keyapis.iot_connect.sber.v1.CommandService/PostV1Command": grpclib.const.Handler(
                self.__rpc_post_v1_command,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostV1CommandRequest,
                PostV1CommandResponse,
            ),
        }


rebuild_dataclass(Model)  # type: ignore
rebuild_dataclass(Device)  # type: ignore
rebuild_dataclass(GetV1DevicesResponse)  # type: ignore
rebuild_dataclass(DeviceCommandArray)  # type: ignore
rebuild_dataclass(DeviceCommand)  # type: ignore
rebuild_dataclass(DeviceCommandValue)  # type: ignore
rebuild_dataclass(PostV1CommandRequest)  # type: ignore
