/*
  Сервис массового оповещения через домофоны
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "keyapis/access_control/v1/keyapis_access_control_access_control_v1.proto";


package keyapis.access_control.v1;

option java_package = "ru.keyapis.access_control.v1";
option java_outer_classname = "KeyapisAccessControlV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_access_control_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.AccessControl.V1";
option objc_class_prefix = "KEYAPISACCESSCONTROLV1";
option php_namespace = "Keyapis\\AccessControl\\V1";
option ruby_package = "Keyapis::AccessControl::V1";
option optimize_for = LITE_RUNTIME;

// Сервис для массового оповещения через домофоны
service BroadcastAlertService {
  // Метод запуска массового оповещения через домофоны.
  // Метод доступен для: ApiKey
  rpc PostBroadcastAlertStart (PostBroadcastAlertStartRequest) returns (PostBroadcastAlertStartResponse) {
    option (google.api.http) = {
      post: "/access_control/internal/api/v1/broadcast_alert/start"
      body: "*"
    };
  }
  // Метод прекращения массового оповещения через домофоны.
  // Метод доступен для: ApiKey
  rpc PostBroadcastAlertStop (PostBroadcastAlertStopRequest) returns (PostBroadcastAlertStopResponse) {
    option (google.api.http) = {
      post: "/access_control/internal/api/v1/broadcast_alert/stop"
      body: "*"
    };
  }
}

// Запрос на запуск массового оповещения через домофоны
message PostBroadcastAlertStartRequest {
  // Ссылка на звуковой файл для проигрывания.
  // Файл должен лежать на внутреннем хранилище.
  // # Диапазон: 2..100
  string sound_file_uri = 1 [(google.api.field_behavior) = REQUIRED];
  // Массив ОРПОНов домов, на которых запускаем проигрывание.
  // # Диапазон: 1..100
  repeated int64 orpons = 2;
  // Длительность воспроизведения такта в секундах.
  // Такт включает в себя проигрывание файла на трубках или на динамике.
  // # Диапазон: 0..65536
  int32 tact_play_duration = 3 [(google.api.field_behavior) = REQUIRED];
  // Количество последовательных повторов тактов перед сменой динамика на трубки или наоборот.
  // # Диапазон: 0..65536
  int32 tact_repeat_count = 4 [(google.api.field_behavior) = REQUIRED];
  // Количество дополнительных повторов тактов, т.е. умолчание=0 - это проигрывание одного такта.
  // # Диапазон: 0..65536
  int32 play_repeat_count = 5 [(google.api.field_behavior) = REQUIRED];
  // Тип проигрывания.
  // # Тип: byte
  enum PlayType {
    // Значение не указано
    PLAY_TYPE_UNKNOWN = 0;
    // Только на аналоговые трубки
    HANDSET_ONLY = 1;
    // Tолько на динамик домофона
    SPEAKER_ONLY = 2;
    // Сначала на аналоговые трубки проигрываем заданное количество тактов, затем на динамик домофона
    HANDSET_AND_SPEAKER = 3;
    // Сначала на динамик домофона проигрываем заданное количество тактов, затем на аналоговые трубки
    SPEAKER_AND_HANDSET = 4;
  }
  // Тип проигрывания
  PlayType play_type = 6 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос на запуск массового оповещения через домофоны
message PostBroadcastAlertStartResponse {
  // Ошибка запроса
  message Error {
    // Звуковой файл не найден
    message SoundFileNotFound {}
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
      // Звуковой файл не найден
      SoundFileNotFound sound_file_not_found = 2;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос на прекращение массового оповещения через домофоны
message PostBroadcastAlertStopRequest {
  // Массив ОРПОНов домов, на которых запускаем проигрывание.
  // # Диапазон: 1..100
  repeated int64 orpons = 1;
}

// Ответ на запрос на прекращение массового оповещения через домофоны
message PostBroadcastAlertStopResponse {
  // Ошибка запроса
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип результата
  oneof type {
    // Ошибка
    Error error = 1;
  }
}
