# 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
# 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 DeviceStatusStatusType(betterproto.Enum):
    """Справочник типов статусов"""

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

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

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

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

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

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

    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 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, config={"extra": "forbid"})
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, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class GetDeviceStatusListRequest(betterproto.Message):
    """Запрос получения списка"""

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

    paging: "DeviceStatusPaging | 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 GetDeviceStatusListResponse(betterproto.Message):
    """Ответ на запрос получения списка статусов доступности устройств"""

    data: "DeviceStatus | 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 GetDeviceStatusCountRequest(betterproto.Message):
    """Запрос получения количества записей"""

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


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

    data: "int | None" = betterproto.int32_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 GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


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

    pass


class DeviceStatusServiceStub(betterproto.ServiceStub):
    async def get_device_status_list(
        self,
        get_device_status_list_request: "GetDeviceStatusListRequest",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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)
        yield GetDeviceStatusListResponse()

    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,
            ),
        }


rebuild_dataclass(DeviceStatus)  # type: ignore
rebuild_dataclass(DeviceStatusFilter)  # type: ignore
rebuild_dataclass(DeviceStatusPaging)  # type: ignore
rebuild_dataclass(GetDeviceStatusListRequest)  # type: ignore
rebuild_dataclass(GetDeviceStatusListResponse)  # type: ignore
rebuild_dataclass(GetDeviceStatusCountRequest)  # type: ignore
