/*
  Сервис реализует поток изменений ресурсов домена Телеметрии
*/
syntax = "proto3";

import "google/api/field_behavior.proto";
import "keyapis/telemetry_control/v1/keyapis_telemetry_control_building_v1.proto";
import "keyapis/telemetry_control/v1/keyapis_telemetry_control_device_v1.proto";

package keyapis.telemetry_control.v1;

option java_package = "ru.keyapis.telemetry_control.v1";
option java_outer_classname = "KeyapisTelemetryControlV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_telemetry_control_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.TelemetryControl.V1";
option objc_class_prefix = "KEYAPISTELEMETRYCONTROLV1";
option php_namespace = "Keyapis\\TelemetryControl\\V1";
option ruby_package = "Keyapis::TelemetryControl::V1";
option optimize_for = LITE_RUNTIME;

// Сервис реализует поток изменений ресурсов домена Телеметрии.
// Авторизация:
//   - X-Api-Key: apiKey
service StreamService {
  // Полнодуплексный отправки статусов получения ресурсов на сервер и получения изменения ресурсов со стороны сервера.
  // Метод доступен для: ApiKey: Без учета разрешений. С контролем привязки домов к группе
  rpc PostResourceFullDuplex (stream PostResourceFullDuplexRequest) returns (stream PostResourceFullDuplexResponse) {}
}

// Событие создания/изменения ресурса
message PostResourceFullDuplexResponse {
  // Событие удаления ресурса
  message RemoveResourceEvent {
    // Идентификатор ресурса
    ResourceId resource_id = 1 [(google.api.field_behavior) = REQUIRED];
  }
  // Событие создания/обновления ресурса
  message UpsertResourceEvent {
    // Ресурс
    Resource resource = 1 [(google.api.field_behavior) = REQUIRED];
  }
  // Идентификатор запроса
  string request_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Событие
  oneof event {
    // Событие создания/обновления ресурса
    UpsertResourceEvent upsert_resource_event = 2;
    // Событие удаления ресурса
    RemoveResourceEvent remove_resource_event = 3;
  }
}

// Идентификатор ресурса
message ResourceId {
  // Тип результата
  oneof type {
    // Идентификатор объекта строительства
    int32 building_id = 1;
    // Идентификатор ПУ
    int32 device_id = 2;
    // Идентификатор ТУ
    string metric_point_id = 3;
    // Идентификатор индикатора
    int32 indicator_id = 4;
    // Связка индикатора и ТУ
    DeviceIndicatorMetricPoint indicator_metric_point = 5;
  }
}

// Ресурс
message Resource {
  // Тип результата
  oneof type {
    // Объект строительства
    Building building = 1;
    // Идентификатор ПУ
    Device device = 2;
    // Точка учета
    Device.MetricPoint metric_point = 3;
    // Индикатор
    Indicator indicator = 4;
    // Связка индикатора и ТУ
    DeviceIndicatorMetricPoint indicator_metric_point = 5;
  }
}

// Запрос создания задачи с клиента на сервере
message PostResourceFullDuplexRequest {
  // Результат обработки ресурса на клиенте
  message ResourceAsyncStatus {
    // Команда принята
    message Success {}
    // Ошибки обработки ресурса на клиенте
    message Error {
      // Неизвестная ошибка на стороне клиента
      message UnknownError {
        // Произвольный текст ошибки на стороне клиента.
        // Отправляется в случае если в спецификации нет подходящей ошибки.
        // После анализа таких ошибок в спецификацию добавляется специальный тип под эту ошибку
        string message = 1 [(google.api.field_behavior) = REQUIRED];
      }
      // Причина ошибки
      oneof reason {
        // Неизвестная ошибка
        UnknownError unknown = 1;
      }
    }
    // Идентификатор ресурса
    ResourceId resource_id = 1 [(google.api.field_behavior) = REQUIRED];
    // Тип результата
    oneof type {
      // Успех
      Success data = 2;
      // Ошибка
      Error error = 3;
    }
  }
  // Идентификатор запроса
  string request_id = 1;
  // Задача с клиента
  oneof task {
    // Результат обработки ресурса на клиенте
    ResourceAsyncStatus resource_async_status = 2;
  }
}

