# 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
# This file has been @generated

from collections.abc import (
    AsyncIterable,
    AsyncIterator,
    Iterable,
)
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 MessagePushCallPushCallType(betterproto.Enum):
    """Тип пуш-токена"""

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

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

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

    @classmethod
    def __get_pydantic_core_schema__(cls, _source_type, _handler):
        from pydantic_core import core_schema

        return core_schema.int_schema(ge=0)


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"""

    @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 PostMessageFullDuplexRequest(betterproto.Message):
    """Поток отправляемых событий"""

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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

    @model_validator(mode="after")
    def check_oneof(cls, values):
        return cls._validate_field_groups(values)


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

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

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


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

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

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

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

    device_camera_id: "str | None" = 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, config={"extra": "forbid"})
class MessagePushCallPushCall(betterproto.Message):
    """Звонковый пуш"""

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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


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

    pass


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

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


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

    pass


@dataclass(eq=False, repr=False, config={"extra": "forbid"})
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, config={"extra": "forbid"})
class SendingSmsTaskTemplateVariable(betterproto.Message):
    """Переменные шаблона"""

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

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


@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 MessageServiceStub(betterproto.ServiceStub):
    async def post_message_full_duplex(
        self,
        post_message_full_duplex_request_iterator: "AsyncIterable[PostMessageFullDuplexRequest] | Iterable[PostMessageFullDuplexRequest]",
        *,
        timeout: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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: "float | None" = None,
        deadline: "Deadline | None" = None,
        metadata: "MetadataLike | None" = 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)
        yield PostMessageFullDuplexResponse()

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


rebuild_dataclass(PostMessageFullDuplexRequest)  # type: ignore
rebuild_dataclass(PostMessageFullDuplexResponse)  # type: ignore
rebuild_dataclass(MessagePushCall)  # type: ignore
rebuild_dataclass(MessagePushCallMessage)  # type: ignore
rebuild_dataclass(MessagePushCallPushCall)  # type: ignore
rebuild_dataclass(MessageMobilePushCall)  # type: ignore
rebuild_dataclass(MessageMobilePushCallMessage)  # type: ignore
rebuild_dataclass(MessageMobilePushCallPushCall)  # type: ignore
rebuild_dataclass(PostMessagePushCallRequest)  # type: ignore
rebuild_dataclass(PostMessageMobilePushCallRequest)  # type: ignore
rebuild_dataclass(SendingSmsTask)  # type: ignore
