# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/telemetry_metric/v1/keyapis_telemetry_metric_events_v1.proto, keyapis/telemetry_metric/v1/keyapis_telemetry_metric_measurement_v1.proto, keyapis/telemetry_metric/v1/keyapis_telemetry_metric_system_v1.proto
# plugin: python-betterproto
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterable,
    AsyncIterator,
    Dict,
    Iterable,
    List,
    Optional,
    Union,
)

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

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

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

    SYNCED_AT = 2
    """По дате synced_at"""


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

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

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

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


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

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

    HUB = 1
    """Коммуникационный модуль"""

    PULSE_COUNTER_RECORDER = 2
    """Счетчик импульсов - регистратор"""

    PULSE_COUNTER_RECORDER_LR = 3
    """Счетчик импульсов - регистратор LoRaWAN"""

    METERING_DEVICE = 4
    """Прибор учета расхода коммунальных услуг"""

    INTERFACE_CONVERTER = 5
    """Конвертер интерфейсов"""

    M_BUS_HUB = 6
    """M-BUS концентратор"""

    COMMUNICATION_MODULE_LR = 7
    """Модуль связи LoRaWAN"""

    BASE_LR = 8
    """Базовая станция LoRaWAN"""


class MeasurementMetricType(betterproto.Enum):
    """Справочние типов энергоресурсов"""

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

    HOT_WATER = 1
    """Горячая вода"""

    COLD_WATER = 2
    """Холодная вода"""

    HEAT = 3
    """Теплоэнергия"""

    GAS = 4
    """Газ"""

    ELECTRICITY = 5
    """Электроэнергия"""


class MeasurementUnitType(betterproto.Enum):
    """Справочник типов единиц измерений"""

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

    PERCENT = 1
    """Процент"""

    C = 2
    """Градус по Цельсию"""

    WT = 3
    """Ватт"""

    GKAL = 4
    """Гигакалория"""

    VALUE = 5
    """Количество"""

    KWH = 6
    """Киловaтт-час"""

    KG_CM2 = 7
    """Килограмм на квадратный сантиметр"""

    KGF_CM2 = 8
    """Килограмм-сила на квадратный сантиметр"""

    M3 = 9
    """Кубический метр"""

    M3_H = 10
    """Кубический метр в час"""

    MPA = 11
    """Мегапаскаль"""

    MS = 12
    """Миллисекунда"""

    BOOLEAN = 13
    """Флаг состояния"""

    T = 14
    """Тонна"""

    T_H = 15
    """Тонна в час"""

    H = 16
    """Час"""

    NON_MEASURABLE = 17
    """Безразмерная величина"""

    IMP = 18
    """Импульс"""

    J = 19
    """Джоуль"""

    KJ = 20
    """Килоджоуль"""

    GJ = 21
    """Гигаджоуль"""

    WTH = 22
    """Ватт-час"""

    KWT = 23
    """Киловатт"""

    MIN = 24
    """Минута"""

    S = 25
    """Секунда"""


@dataclass(eq=False, repr=False)
class IndicatorsMetadataStartTask(betterproto.Message):
    """
    Сигнал на старт обогащения метаданных индикаторов. Очередь
    key.telemetry_metric.indicators_metadata_start_task
    """

    pass


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

    filter: "MeasurementFilter" = betterproto.message_field(1)
    """Параметры фильтрации измерений"""

    paging: "MeasurementPaging" = betterproto.message_field(2, group="pagination")
    """Параметры пагинации по измерениям"""


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

    filter: "MeasurementFilter" = betterproto.message_field(1)
    """Параметры фильтрации измерений"""

    paging: "MeasurementPaging" = betterproto.message_field(2, group="pagination")
    """Параметры пагинации по измерениям"""


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

    data: "Measurement" = betterproto.message_field(1, group="type")
    """Значение измерения"""


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

    data: "Measurement" = betterproto.message_field(1, group="type")
    """Значение измерения"""


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

    fias_ids: List[str] = betterproto.string_field(1)
    """По ФИАСам"""

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

    indicator_ids: List[int] = betterproto.int32_field(3)
    """По идентификаторам индикаторов"""

    begin_synced_at: datetime = betterproto.message_field(4)
    """От даты синхронизации включительно (>=)"""

    end_synced_at: datetime = betterproto.message_field(5)
    """До даты синхронизации (<)"""

    device_models: List[str] = betterproto.string_field(6)
    """По моделям устройств"""

    device_types: List["MeasurementDeviceType"] = betterproto.enum_field(7)
    """По типам устройств"""

    metric_types: List["MeasurementMetricType"] = betterproto.enum_field(8)
    """По типам измерений"""

    is_border_measurements_only: Optional[bool] = betterproto.message_field(
        9, wraps=betterproto.TYPE_BOOL
    )
    """
    Ограничение результатов только пограничными значениями для периода. Если
    border_measurements_only=null возвращаем измерения по условиям фильтра,
    уникальные по (indicator_id, synced_at). Если
    border_measurements_only=falsе возвращаем измерения по условиям фильтра,
    уникальные по (indicator_id, synced_at). Если заданы
    border_measurements_only=true, begin_synced_at, end_synced_at возвращаем
    два измерения ближайшие к границам периода. Если заданы
    border_measurements_only=true, и не задана end_synced_at возвращаем одно
    измерение ближайшее к begin_synced_at. Если заданы
    border_measurements_only=true, и не задана begin_synced_at возвращаем одно
    измерение ближайшее к end_synced_at. Если заданы
    border_measurements_only=true и не заданы begin_synced_at и end_synced_at
    возвращаем ошибку валидации параметров
    """


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

    filter: "MeasurementFilter" = betterproto.message_field(1)
    """Параметры фильтрации измерений"""


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

    filter: "MeasurementFilter" = betterproto.message_field(1)
    """Параметры фильтрации измерений"""


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

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


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

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


@dataclass(eq=False, repr=False)
class MeasurementPaging(betterproto.Message):
    """Параметры пагинации измерений"""

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

    direction_type: "MeasurementPagingDirectionType" = 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 PostMeasurementRequest(betterproto.Message):
    """Запрос сохранения измерения"""

    data: "Measurement" = betterproto.message_field(1)
    """Измерение"""


@dataclass(eq=False, repr=False)
class PostMeasurementResponse(betterproto.Message):
    """Ответ на запрос сохранения измерения"""

    pass


@dataclass(eq=False, repr=False)
class PostMeasurementHalfDuplexRequest(betterproto.Message):
    """Запрос сохранения потока измерения"""

    data: "Measurement" = betterproto.message_field(1)
    """Измерение"""


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

    pass


@dataclass(eq=False, repr=False)
class Measurement(betterproto.Message):
    """
    Измерение. Очередь key.telemetry_consumer.measurement_stream_request.v1
    """

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

    value: float = betterproto.float_field(2)
    """Значение"""

    synced_at: datetime = betterproto.message_field(3)
    """
    Временная метка сбора счётчиком. Если не передано берётся серверное время
    """

    fias_id: Optional[str] = betterproto.message_field(4, wraps=betterproto.TYPE_STRING)
    """ФИАС"""

    device_id: Optional[int] = betterproto.message_field(
        5, wraps=betterproto.TYPE_INT32
    )
    """Идентификатор устройства"""

    device_parent_id: Optional[int] = betterproto.message_field(
        6, wraps=betterproto.TYPE_INT32
    )
    """Идентификатор родительского устройства"""

    device_model: Optional[str] = betterproto.message_field(
        7, wraps=betterproto.TYPE_STRING
    )
    """Модель устройства"""

    device_type: "MeasurementDeviceType" = betterproto.enum_field(8)
    """Тип устройства"""

    metric_type: "MeasurementMetricType" = betterproto.enum_field(9)
    """Тип энергоресурса"""

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

    utc_offset: int = betterproto.int32_field(11)
    """Сдвиг таймзоны относительно UTC для даты synced_at"""

    unit_type: "MeasurementUnitType" = betterproto.enum_field(12)
    """Тип единицы измерения, в которой представлено, получаемое измерение"""


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

    pass


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

    pass


class MeasurementServiceStub(betterproto.ServiceStub):
    async def post_measurement(
        self,
        post_measurement_request: "PostMeasurementRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostMeasurementResponse":
        return await self._unary_unary(
            "/keyapis.telemetry_metric.v1.MeasurementService/PostMeasurement",
            post_measurement_request,
            PostMeasurementResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_measurement_half_duplex(
        self,
        post_measurement_half_duplex_request_iterator: Union[
            AsyncIterable["PostMeasurementHalfDuplexRequest"],
            Iterable["PostMeasurementHalfDuplexRequest"],
        ],
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostMeasurementHalfDuplexResponse":
        return await self._stream_unary(
            "/keyapis.telemetry_metric.v1.MeasurementService/PostMeasurementHalfDuplex",
            post_measurement_half_duplex_request_iterator,
            PostMeasurementHalfDuplexRequest,
            PostMeasurementHalfDuplexResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_measurement_list(
        self,
        get_measurement_list_request: "GetMeasurementListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetMeasurementListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementList",
            get_measurement_list_request,
            GetMeasurementListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_measurement_count(
        self,
        get_measurement_count_request: "GetMeasurementCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetMeasurementCountResponse":
        return await self._unary_unary(
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementCount",
            get_measurement_count_request,
            GetMeasurementCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_measurement_converted_list(
        self,
        get_measurement_converted_list_request: "GetMeasurementConvertedListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetMeasurementConvertedListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementConvertedList",
            get_measurement_converted_list_request,
            GetMeasurementConvertedListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_measurement_converted_count(
        self,
        get_measurement_converted_count_request: "GetMeasurementConvertedCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetMeasurementConvertedCountResponse":
        return await self._unary_unary(
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementConvertedCount",
            get_measurement_converted_count_request,
            GetMeasurementConvertedCountResponse,
            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_metric.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class MeasurementServiceBase(ServiceBase):

    async def post_measurement(
        self, post_measurement_request: "PostMeasurementRequest"
    ) -> "PostMeasurementResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_measurement_half_duplex(
        self,
        post_measurement_half_duplex_request_iterator: AsyncIterator[
            "PostMeasurementHalfDuplexRequest"
        ],
    ) -> "PostMeasurementHalfDuplexResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_measurement_list(
        self, get_measurement_list_request: "GetMeasurementListRequest"
    ) -> AsyncIterator["GetMeasurementListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_measurement_count(
        self, get_measurement_count_request: "GetMeasurementCountRequest"
    ) -> "GetMeasurementCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_measurement_converted_list(
        self,
        get_measurement_converted_list_request: "GetMeasurementConvertedListRequest",
    ) -> AsyncIterator["GetMeasurementConvertedListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_measurement_converted_count(
        self,
        get_measurement_converted_count_request: "GetMeasurementConvertedCountRequest",
    ) -> "GetMeasurementConvertedCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_measurement(
        self,
        stream: "grpclib.server.Stream[PostMeasurementRequest, PostMeasurementResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_measurement(request)
        await stream.send_message(response)

    async def __rpc_post_measurement_half_duplex(
        self,
        stream: "grpclib.server.Stream[PostMeasurementHalfDuplexRequest, PostMeasurementHalfDuplexResponse]",
    ) -> None:
        request = stream.__aiter__()
        response = await self.post_measurement_half_duplex(request)
        await stream.send_message(response)

    async def __rpc_get_measurement_list(
        self,
        stream: "grpclib.server.Stream[GetMeasurementListRequest, GetMeasurementListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_measurement_list,
            stream,
            request,
        )

    async def __rpc_get_measurement_count(
        self,
        stream: "grpclib.server.Stream[GetMeasurementCountRequest, GetMeasurementCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_measurement_count(request)
        await stream.send_message(response)

    async def __rpc_get_measurement_converted_list(
        self,
        stream: "grpclib.server.Stream[GetMeasurementConvertedListRequest, GetMeasurementConvertedListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_measurement_converted_list,
            stream,
            request,
        )

    async def __rpc_get_measurement_converted_count(
        self,
        stream: "grpclib.server.Stream[GetMeasurementConvertedCountRequest, GetMeasurementConvertedCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_measurement_converted_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.telemetry_metric.v1.MeasurementService/PostMeasurement": grpclib.const.Handler(
                self.__rpc_post_measurement,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostMeasurementRequest,
                PostMeasurementResponse,
            ),
            "/keyapis.telemetry_metric.v1.MeasurementService/PostMeasurementHalfDuplex": grpclib.const.Handler(
                self.__rpc_post_measurement_half_duplex,
                grpclib.const.Cardinality.STREAM_UNARY,
                PostMeasurementHalfDuplexRequest,
                PostMeasurementHalfDuplexResponse,
            ),
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementList": grpclib.const.Handler(
                self.__rpc_get_measurement_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetMeasurementListRequest,
                GetMeasurementListResponse,
            ),
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementCount": grpclib.const.Handler(
                self.__rpc_get_measurement_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetMeasurementCountRequest,
                GetMeasurementCountResponse,
            ),
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementConvertedList": grpclib.const.Handler(
                self.__rpc_get_measurement_converted_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetMeasurementConvertedListRequest,
                GetMeasurementConvertedListResponse,
            ),
            "/keyapis.telemetry_metric.v1.MeasurementService/GetMeasurementConvertedCount": grpclib.const.Handler(
                self.__rpc_get_measurement_converted_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetMeasurementConvertedCountRequest,
                GetMeasurementConvertedCountResponse,
            ),
        }


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