// Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";
package monitoring;

import "context.proto";
import "kpi_sample_types.proto";

service MonitoringService {
  rpc CreateKpi                (KpiDescriptor        )     returns (KpiId            ) {}
  rpc EditKpiDescriptor        (EditedKpiDescriptor  )     returns (context.Empty    ) {}
  rpc DeleteKpi                (KpiId                )     returns (context.Empty    ) {}
  rpc GetKpiDescriptor         (KpiId                )     returns (KpiDescriptor    ) {}
  rpc GetKpiDescriptorList     (context.Empty        )     returns (KpiDescriptorList) {}
  rpc CreateBundleKpi          (BundleKpiDescriptor  )     returns (KpiId            ) {}
  rpc IncludeKpi               (Kpi                  )     returns (context.Empty    ) {}
  rpc MonitorKpi               (MonitorKpiRequest    )     returns (context.Empty    ) {}
  rpc QueryKpiData             (KpiQuery             )     returns (KpiList          ) {}
  rpc SubscribeKpi             (SubsDescriptor       )     returns (stream KpiList   ) {}
  rpc GetSubsDescriptor        (SubscriptionID       )     returns (SubsDescriptor   ) {}
  rpc GetSubscriptions         (context.Empty        )     returns (SubsIDList       ) {}
  rpc EditKpiSubscription      (SubsDescriptor       )     returns (context.Empty    ) {}
  rpc CreateKpiAlarm           (AlarmDescriptor      )     returns (AlarmID          ) {}
  rpc EditKpiAlarm             (AlarmDescriptor      )     returns (context.Empty    ) {}
  rpc GetAlarms                (context.Empty        )     returns (AlarmIDList      ) {}
  rpc GetAlarmDescriptor       (AlarmSubscription    )     returns (AlarmDescriptor  ) {}
  rpc GetAlarmResponseStream   (AlarmID              )     returns (stream AlarmResponse ) {}
  rpc GetStreamKpi             (KpiId                )     returns (stream Kpi       ) {}
  rpc GetInstantKpi            (KpiId                )     returns (KpiList          ) {}
}

message KpiDescriptor {
  string kpi_description                          = 1;
  kpi_sample_types.KpiSampleType kpi_sample_type  = 2;
  context.DeviceId device_id                      = 3;
  context.EndPointId endpoint_id                  = 4;
  context.ServiceId  service_id                   = 5;
  context.SliceId    slice_id                     = 6;
}

message BundleKpiDescriptor {
  string kpi_description                          = 1;
  repeated KpiId kpi_id_list                      = 2;
  kpi_sample_types.KpiSampleType kpi_sample_type  = 3;
  context.DeviceId device_id                      = 4;
  context.EndPointId endpoint_id                  = 5;
  context.ServiceId  service_id                   = 6;
  context.SliceId    slice_id                     = 7;
}

message EditedKpiDescriptor {
  KpiId kpi_id                                    = 1;
  string kpi_description                          = 2;
  repeated KpiId kpi_id_list                      = 3;
  kpi_sample_types.KpiSampleType kpi_sample_type  = 4;
  context.DeviceId device_id                      = 5;
  context.EndPointId endpoint_id                  = 6;
  context.ServiceId  service_id                   = 7;
  context.SliceId    slice_id                     = 8;
}

message MonitorKpiRequest {
  KpiId kpi_id              = 1;
  float monitoring_window_s = 2;
  float sampling_rate_s     = 3;
  // Pending add field to reflect Available Device Protocols
}

message KpiQuery {
  repeated KpiId kpi_id     = 1;
  float monitoring_window_s = 2;
  float sampling_rate_s     = 3;
  uint32 last_n_samples     = 4;  // used when you want something like "get the last N many samples
  string start_date         = 5;  // used when you want something like "get the samples since X date/time"
  string end_date           = 6;  // used when you want something like "get the samples until X date/time"
  // Pending add field to reflect Available Device Protocols
}

message KpiId {
  context.Uuid kpi_id = 1;
}

message Kpi {
  KpiId kpi_id                 = 1;
  string timestamp  = 2;
  KpiValue kpi_value           = 3;
}

message KpiValueRange {
  KpiValue kpiMinValue = 1;
  KpiValue kpiMaxValue = 2;
  bool inRange         = 3;  // by default False
}

message KpiValue {
  oneof value {
    uint32 intVal     = 1;
    float floatVal    = 2;
    string stringVal  = 3;
    bool boolVal      = 4;
  }
}

message KpiList {
    repeated Kpi kpi_list = 1;
}

message KpiDescriptorList {
    repeated KpiDescriptor kpi_descriptor_list = 1;
}

message SubsDescriptor{
  KpiId kpi_id              = 1;
  float sampling_duration_s = 2;
  float sampling_interval_s = 3;
  string start_date         = 4;  // used when you want something like "get the samples since X date/time"
  string end_date           = 5;  // used when you want something like "get the samples until X date/time"
  // Pending add field to reflect Available Device Protocols
}

message SubscriptionID {
  context.Uuid subs_id = 1;
}

message SubsResponse {
  SubscriptionID subs_id    = 1;
  repeated KpiList kpi_list = 2;
}

message SubsIDList {
  repeated SubscriptionID subs_list = 1;
}

message AlarmDescriptor {
  string alarm_description      = 1;
  string name                   = 2;
  KpiId kpi_id                  = 3;
  KpiValueRange kpi_value_range = 4;
  context.Timestamp timestamp   = 5; // Check context
}

message AlarmID{
  context.Uuid alarm_id = 1;
}

message AlarmSubscription{
  AlarmID alarmID                   = 1;
  float subscription_timeout_s      = 2;
  float subscription_frequency_ms   = 3;
}

message AlarmResponse {
  AlarmID alarm_id              = 1;
  string text                   = 2;
  KpiValue kpi_value            = 3;
  context.Timestamp timestamp   = 4; // Check context
}

message AlarmIDList {
    repeated AlarmID alarm_list = 1;
}
