# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/exchange/v1/keyapis_exchange_events_v1.proto, keyapis/exchange/v1/keyapis_exchange_message_v1.proto, keyapis/exchange/v1/keyapis_exchange_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 MessagePushCallPushCallType(betterproto.Enum):
    """Тип пуш-токена"""

    TYPE_UNKNOWN = 0
    """Не указан"""

    PWA_FCM = 1
    """Для PWA Firebase Cloud Messaging"""

    PWA_APNS = 2
    """Для PWA Apple Notification System"""


class MessageMobilePushCallPushCallType(betterproto.Enum):
    """Тип пуш-токена"""

    TYPE_UNKNOWN = 0
    """Не указан"""

    MOBILE_FCM = 1
    """Для Mobile Firebase Cloud Messaging"""

    MOBILE_HMS = 2
    """Для Mobile Huawei Messaging System"""

    MOBILE_APNS_TEXT = 3
    """Для Mobile Apple PushToken System для текста"""

    MOBILE_APNS_CALL = 4
    """Для Mobile Apple PushToken System для звонков"""

    MOBILE_RUSTORE = 5
    """Для Mobile RuStore"""


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

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    post_message_push_call: "PostMessagePushCallRequest" = betterproto.message_field(
        2, group="task"
    )
    """Отправка звонкового сообщения"""


@dataclass(eq=False, repr=False)
class PostMessageFullDuplexResponse(betterproto.Message):
    """Поток ответов на задачи"""

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

    post_message_push_call: "PostMessagePushCallResponse" = betterproto.message_field(
        2, group="event"
    )
    """Ответ на отправку звонкового сообщения"""


@dataclass(eq=False, repr=False)
class MessagePushCall(betterproto.Message):
    """Звонковое сообщение"""

    message: "MessagePushCallMessage" = betterproto.message_field(1)
    """Сообщение"""

    push_call: "MessagePushCallPushCall" = betterproto.message_field(2)
    """Звонковый пуш"""


@dataclass(eq=False, repr=False)
class MessagePushCallMessage(betterproto.Message):
    """Сообщение"""

    title: str = betterproto.string_field(1)
    """Заголовок уведомления"""

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

    device_title: Optional[str] = betterproto.message_field(
        3, wraps=betterproto.TYPE_STRING
    )
    """Название устройства источника"""

    device_camera_id: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Идентификатор камеры устройства источника. Тип: Guid"""

    sip_server_host: str = betterproto.string_field(5)
    """Адрес SIP сервера"""

    sip_server_port: int = betterproto.int32_field(6)
    """Порт SIP сервера"""

    sip_account_login: str = betterproto.string_field(7)
    """Логин SIP аккаунта"""

    sip_account_password: str = betterproto.string_field(8)
    """Пароль SIP аккаунта"""

    call_created_at: datetime = betterproto.message_field(9)
    """Момент инициации звонка"""


@dataclass(eq=False, repr=False)
class MessagePushCallPushCall(betterproto.Message):
    """Звонковый пуш"""

    token: str = betterproto.string_field(1)
    """Пуш-токен адресата звонка"""

    type: "MessagePushCallPushCallType" = betterproto.enum_field(2)
    """Тип пуш-токена"""


@dataclass(eq=False, repr=False)
class MessageMobilePushCall(betterproto.Message):
    """Звонковое сообщение для мобильных приложений"""

    message: "MessageMobilePushCallMessage" = betterproto.message_field(1)
    """Сообщение"""

    push_call: "MessageMobilePushCallPushCall" = betterproto.message_field(2)
    """Звонковый пуш"""


@dataclass(eq=False, repr=False)
class MessageMobilePushCallMessage(betterproto.Message):
    """Сообщение"""

    title: str = betterproto.string_field(1)
    """Заголовок уведомления"""

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

    device_title: Optional[str] = betterproto.message_field(
        3, wraps=betterproto.TYPE_STRING
    )
    """Название устройства источника"""

    device_camera_id: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Идентификатор камеры устройства источника. Тип: Guid"""

    sip_token: str = betterproto.string_field(5)
    """SIP-токен"""

    sip_server_host: Optional[str] = betterproto.message_field(
        6, wraps=betterproto.TYPE_STRING
    )
    """Адрес SIP сервера"""

    sip_server_port: Optional[int] = betterproto.message_field(
        7, wraps=betterproto.TYPE_INT32
    )
    """Порт SIP сервера"""

    sip_account_login: Optional[str] = betterproto.message_field(
        8, wraps=betterproto.TYPE_STRING
    )
    """Логин SIP аккаунта"""

    sip_account_password: Optional[str] = betterproto.message_field(
        9, wraps=betterproto.TYPE_STRING
    )
    """Пароль SIP аккаунта"""

    stun_server_host: Optional[str] = betterproto.message_field(
        10, wraps=betterproto.TYPE_STRING
    )
    """Адрес STUN сервера"""

    stun_server_port: Optional[int] = betterproto.message_field(
        11, wraps=betterproto.TYPE_INT32
    )
    """Порт STUN сервера"""

    call_created_at: datetime = betterproto.message_field(12)
    """Момент инициации звонка"""


@dataclass(eq=False, repr=False)
class MessageMobilePushCallPushCall(betterproto.Message):
    """Звонковый пуш"""

    token: str = betterproto.string_field(1)
    """Пуш-токен адресата звонка"""

    type: "MessageMobilePushCallPushCallType" = betterproto.enum_field(2)
    """Тип пуш-токена"""


@dataclass(eq=False, repr=False)
class PostMessagePushCallRequest(betterproto.Message):
    """Запрос на отправку звонкового пуш сообщения"""

    data: "MessagePushCall" = betterproto.message_field(1)
    """Звонковый пуш"""


@dataclass(eq=False, repr=False)
class PostMessagePushCallResponse(betterproto.Message):
    """Ответ на запрос на отправку звонкового пуш сообщения"""

    pass


@dataclass(eq=False, repr=False)
class PostMessageMobilePushCallRequest(betterproto.Message):
    """
    Запрос на отправку звонкового пуш сообщения для мобильного приложения
    """

    data: "MessageMobilePushCall" = betterproto.message_field(1)
    """Звонковый пуш"""


@dataclass(eq=False, repr=False)
class PostMessageMobilePushCallResponse(betterproto.Message):
    """
    Ответ на запрос на отправку звонкового пуш сообщения для мобильного
    приложения
    """

    pass


@dataclass(eq=False, repr=False)
class SendingSmsTask(betterproto.Message):
    """Задача на отправку СМС. Очередь key.exchange.sending_sms"""

    request_id: str = betterproto.string_field(1)
    """Идентификатор запроса"""

    template_kind: str = betterproto.string_field(2)
    """Тип шаблона"""

    destination: str = betterproto.string_field(3)
    """Назначение"""

    template_variables: List["SendingSmsTaskTemplateVariable"] = (
        betterproto.message_field(4)
    )
    """Переменные шаблона"""


@dataclass(eq=False, repr=False)
class SendingSmsTaskTemplateVariable(betterproto.Message):
    """Переменные шаблона"""

    name: str = betterproto.string_field(1)
    """Наименование"""

    value: str = betterproto.string_field(2)
    """Значение"""


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

    pass


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

    pass


class MessageServiceStub(betterproto.ServiceStub):
    async def post_message_full_duplex(
        self,
        post_message_full_duplex_request_iterator: Union[
            AsyncIterable["PostMessageFullDuplexRequest"],
            Iterable["PostMessageFullDuplexRequest"],
        ],
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["PostMessageFullDuplexResponse"]:
        async for response in self._stream_stream(
            "/keyapis.exchange.v1.MessageService/PostMessageFullDuplex",
            post_message_full_duplex_request_iterator,
            PostMessageFullDuplexRequest,
            PostMessageFullDuplexResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def post_message_push_call(
        self,
        post_message_push_call_request: "PostMessagePushCallRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostMessagePushCallResponse":
        return await self._unary_unary(
            "/keyapis.exchange.v1.MessageService/PostMessagePushCall",
            post_message_push_call_request,
            PostMessagePushCallResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def post_message_mobile_push_call(
        self,
        post_message_mobile_push_call_request: "PostMessageMobilePushCallRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostMessageMobilePushCallResponse":
        return await self._unary_unary(
            "/keyapis.exchange.v1.MessageService/PostMessageMobilePushCall",
            post_message_mobile_push_call_request,
            PostMessageMobilePushCallResponse,
            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.exchange.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class MessageServiceBase(ServiceBase):

    async def post_message_full_duplex(
        self,
        post_message_full_duplex_request_iterator: AsyncIterator[
            "PostMessageFullDuplexRequest"
        ],
    ) -> AsyncIterator["PostMessageFullDuplexResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_message_push_call(
        self, post_message_push_call_request: "PostMessagePushCallRequest"
    ) -> "PostMessagePushCallResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def post_message_mobile_push_call(
        self, post_message_mobile_push_call_request: "PostMessageMobilePushCallRequest"
    ) -> "PostMessageMobilePushCallResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_message_full_duplex(
        self,
        stream: "grpclib.server.Stream[PostMessageFullDuplexRequest, PostMessageFullDuplexResponse]",
    ) -> None:
        request = stream.__aiter__()
        await self._call_rpc_handler_server_stream(
            self.post_message_full_duplex,
            stream,
            request,
        )

    async def __rpc_post_message_push_call(
        self,
        stream: "grpclib.server.Stream[PostMessagePushCallRequest, PostMessagePushCallResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_message_push_call(request)
        await stream.send_message(response)

    async def __rpc_post_message_mobile_push_call(
        self,
        stream: "grpclib.server.Stream[PostMessageMobilePushCallRequest, PostMessageMobilePushCallResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_message_mobile_push_call(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.exchange.v1.MessageService/PostMessageFullDuplex": grpclib.const.Handler(
                self.__rpc_post_message_full_duplex,
                grpclib.const.Cardinality.STREAM_STREAM,
                PostMessageFullDuplexRequest,
                PostMessageFullDuplexResponse,
            ),
            "/keyapis.exchange.v1.MessageService/PostMessagePushCall": grpclib.const.Handler(
                self.__rpc_post_message_push_call,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostMessagePushCallRequest,
                PostMessagePushCallResponse,
            ),
            "/keyapis.exchange.v1.MessageService/PostMessageMobilePushCall": grpclib.const.Handler(
                self.__rpc_post_message_mobile_push_call,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostMessageMobilePushCallRequest,
                PostMessageMobilePushCallResponse,
            ),
        }


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