# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/telemetry_status/v1/keyapis_telemetry_status_device_v1.proto, keyapis/telemetry_status/v1/keyapis_telemetry_status_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 DeviceStatusStatusType(betterproto.Enum):
    """Справочник типов статусов"""

    STATUS_TYPE_UNKNOWN = 0
    """Значение не указано. Проверка доступности не выполнялась"""

    OFFLINE = 1
    """Не доступен"""

    ONLINE = 2
    """Доступен"""


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

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

    CHECKED_AT = 1
    """По дате проверки"""

    DEVICE_ID = 2
    """По идентификатору"""


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

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

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

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


@dataclass(eq=False, repr=False)
class DeviceStatus(betterproto.Message):
    """Статус доступности устройства"""

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

    ip: str = betterproto.string_field(2)
    """IP-адрес устройства"""

    checked_at: datetime = betterproto.message_field(3)
    """Момент проверки статуса"""

    status_type: "DeviceStatusStatusType" = betterproto.enum_field(4)
    """Тип статуса"""


@dataclass(eq=False, repr=False)
class DeviceStatusFilter(betterproto.Message):
    """
    Фильтр для запроса статусов доступности устройств. При передаче массива в
    параметр фильтра элементы массива работают в выборке через ИЛИ. При
    передаче нескольких разных параметров фильтра они работают в выборке через
    И
    """

    device_ids: List[int] = betterproto.int32_field(1)
    """По списку приборов учета"""

    status_types: List["DeviceStatusStatusType"] = betterproto.enum_field(2)
    """По cтатусам доступности"""


@dataclass(eq=False, repr=False)
class DeviceStatusPaging(betterproto.Message):
    """Пагинация статусов сетевой доступности"""

    order_by_type: "DeviceStatusPagingOrderByType" = betterproto.enum_field(1)
    """Тип значения сортировки. По умолчанию: CHECKED_AT"""

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

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

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


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

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

    paging: "DeviceStatusPaging" = betterproto.message_field(2, group="pagination")
    """Пагинация"""


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

    data: "DeviceStatus" = betterproto.message_field(1, group="type")
    """Статус доступности устройства"""


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

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


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

    data: int = betterproto.int32_field(1, group="type")
    """Всего записей"""


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

    pass


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

    pass


class DeviceStatusServiceStub(betterproto.ServiceStub):
    async def get_device_status_list(
        self,
        get_device_status_list_request: "GetDeviceStatusListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetDeviceStatusListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.telemetry_status.v1.DeviceStatusService/GetDeviceStatusList",
            get_device_status_list_request,
            GetDeviceStatusListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_device_status_count(
        self,
        get_device_status_count_request: "GetDeviceStatusCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetDeviceStatusCountResponse":
        return await self._unary_unary(
            "/keyapis.telemetry_status.v1.DeviceStatusService/GetDeviceStatusCount",
            get_device_status_count_request,
            GetDeviceStatusCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


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


class DeviceStatusServiceBase(ServiceBase):

    async def get_device_status_list(
        self, get_device_status_list_request: "GetDeviceStatusListRequest"
    ) -> AsyncIterator["GetDeviceStatusListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_device_status_count(
        self, get_device_status_count_request: "GetDeviceStatusCountRequest"
    ) -> "GetDeviceStatusCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_device_status_list(
        self,
        stream: "grpclib.server.Stream[GetDeviceStatusListRequest, GetDeviceStatusListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_device_status_list,
            stream,
            request,
        )

    async def __rpc_get_device_status_count(
        self,
        stream: "grpclib.server.Stream[GetDeviceStatusCountRequest, GetDeviceStatusCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_device_status_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.telemetry_status.v1.DeviceStatusService/GetDeviceStatusList": grpclib.const.Handler(
                self.__rpc_get_device_status_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetDeviceStatusListRequest,
                GetDeviceStatusListResponse,
            ),
            "/keyapis.telemetry_status.v1.DeviceStatusService/GetDeviceStatusCount": grpclib.const.Handler(
                self.__rpc_get_device_status_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetDeviceStatusCountRequest,
                GetDeviceStatusCountResponse,
            ),
        }


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