/*
  Сервис реализует функционал передачи сообщений.
  Это альтернативный путь передачии команд в реальном времени в exchange минуя NATS
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/timestamp.proto";

package keyapis.exchange.v1;

option java_package = "ru.keyapis.exchange.v1";
option java_outer_classname = "KeyapisExchangeV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_exchange_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.Exchange.V1";
option objc_class_prefix = "KEYAPISEXCHANGEYV1";
option php_namespace = "Keyapis\\Exchange\\V1";
option ruby_package = "Keyapis::Exchange::V1";
option optimize_for = LITE_RUNTIME;


// Сервис передачи сообщений
service MessageService {
  // Полнодуплексный метод отправки задач и получения их результатов выполнения.
  // Метод доступен для: admin, service, application(exchange:edit)
  rpc PostMessageFullDuplex(stream PostMessageFullDuplexRequest) returns (stream PostMessageFullDuplexResponse) {}
  // Метод отправки задач и получения их результатов выполнения.
  // Метод доступен для: admin, service, application(exchange:edit)
  rpc PostMessagePushCall(PostMessagePushCallRequest) returns (PostMessagePushCallResponse) {
    option (google.api.http) = {
      post: "/exchange/api/v1/message_push_call"
      body: "*"
    };
  }
  // Метод отправки задач и получения их результатов выполнения для мобильного приложения.
  // Метод доступен для: admin, service
  rpc PostMessageMobilePushCall(PostMessageMobilePushCallRequest) returns (PostMessageMobilePushCallResponse) {
    option (google.api.http) = {
      post: "/exchange/api/v1/message_mobile_push_call"
      body: "*"
    };
  }
}

// Поток отправляемых событий
message PostMessageFullDuplexRequest {
  // Идентификатор запроса
  string request_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Задача запроса
  oneof task {
    // Отправка звонкового сообщения
    PostMessagePushCallRequest post_message_push_call = 2;
  }
}
// Поток ответов на задачи
message PostMessageFullDuplexResponse {
  // Идентификатор ответа
  string request_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Событие
  oneof event {
    // Ответ на отправку звонкового сообщения
    PostMessagePushCallResponse post_message_push_call = 2;
  }
}

// Звонковое сообщение
message MessagePushCall {
  // Сообщение
  message Message {
    // Заголовок уведомления
    string title = 1 [(google.api.field_behavior) = REQUIRED];
    // Идентификатор устройства источника
    int32 device_id = 2 [(google.api.field_behavior) = REQUIRED];
    // Название устройства источника
    google.protobuf.StringValue device_title = 3;
    // Идентификатор камеры устройства источника.
    // Тип: Guid
    google.protobuf.StringValue device_camera_id = 4;
    // Адрес SIP сервера
    string sip_server_host = 5 [(google.api.field_behavior) = REQUIRED];
    // Порт SIP сервера
    int32 sip_server_port = 6 [(google.api.field_behavior) = REQUIRED];
    // Логин SIP аккаунта
    string sip_account_login = 7 [(google.api.field_behavior) = REQUIRED];
    // Пароль SIP аккаунта
    string sip_account_password = 8 [(google.api.field_behavior) = REQUIRED];
    // Момент инициации звонка
    google.protobuf.Timestamp call_created_at = 9 [(google.api.field_behavior) = REQUIRED];
  }
  // Сообщение
  Message message = 1 [(google.api.field_behavior) = REQUIRED];
  // Звонковый пуш
  message PushCall {
    // Пуш-токен адресата звонка
    string token = 1 [(google.api.field_behavior) = REQUIRED];
    // Тип пуш-токена
    enum Type {
      // Не указан
      TYPE_UNKNOWN = 0;
      // Для PWA Firebase Cloud Messaging
      PWA_FCM = 1;
      // Для PWA Apple Notification System
      PWA_APNS = 2;
    }
    // Тип пуш-токена
    Type type = 2 [(google.api.field_behavior) = REQUIRED];
  }
  // Звонковый пуш
  PushCall push_call = 2 [(google.api.field_behavior) = REQUIRED];
}

// Звонковое сообщение для мобильных приложений
message MessageMobilePushCall {
  // Сообщение
  message Message {
    // Заголовок уведомления
    string title = 1 [(google.api.field_behavior) = REQUIRED];
    // Идентификатор устройства источника
    int32 device_id = 2 [(google.api.field_behavior) = REQUIRED];
    // Название устройства источника
    google.protobuf.StringValue device_title = 3;
    // Идентификатор камеры устройства источника.
    // Тип: Guid
    google.protobuf.StringValue device_camera_id = 4;
    // SIP-токен
    string sip_token = 5 [(google.api.field_behavior) = REQUIRED];
    // Адрес SIP сервера
    google.protobuf.StringValue sip_server_host = 6;
    // Порт SIP сервера
    google.protobuf.Int32Value sip_server_port = 7;
    // Логин SIP аккаунта
    google.protobuf.StringValue sip_account_login = 8;
    // Пароль SIP аккаунта
    google.protobuf.StringValue sip_account_password = 9;
    // Адрес STUN сервера
    google.protobuf.StringValue stun_server_host = 10;
    // Порт STUN сервера
    google.protobuf.Int32Value stun_server_port = 11;    
    // Момент инициации звонка
    google.protobuf.Timestamp call_created_at = 12 [(google.api.field_behavior) = REQUIRED];
  }
  // Сообщение
  Message message = 1 [(google.api.field_behavior) = REQUIRED];
  // Звонковый пуш
  message PushCall {
    // Пуш-токен адресата звонка
    string token = 1 [(google.api.field_behavior) = REQUIRED];
    // Тип пуш-токена
    enum Type {
      // Не указан
      TYPE_UNKNOWN = 0;
      // Для Mobile Firebase Cloud Messaging
      MOBILE_FCM = 1;
      // Для Mobile Huawei Messaging System
      MOBILE_HMS = 2;
      // Для Mobile Apple PushToken System для текста
      MOBILE_APNS_TEXT = 3;
      // Для Mobile Apple PushToken System для звонков
      MOBILE_APNS_CALL = 4;
      // Для Mobile RuStore
      MOBILE_RUSTORE = 5;
    }
    // Тип пуш-токена
    Type type = 2 [(google.api.field_behavior) = REQUIRED];
  }
  // Звонковый пуш
  PushCall push_call = 2 [(google.api.field_behavior) = REQUIRED];
}

// Запрос на отправку звонкового пуш сообщения
message PostMessagePushCallRequest {
  // Звонковый пуш
  MessagePushCall data = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос на отправку звонкового пуш сообщения
message PostMessagePushCallResponse {
}

// Запрос на отправку звонкового пуш сообщения для мобильного приложения
message PostMessageMobilePushCallRequest {
  // Звонковый пуш
  MessageMobilePushCall data = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос на отправку звонкового пуш сообщения для мобильного приложения
message PostMessageMobilePushCallResponse {
}
