/*
  Спецификация для работы с видеоданными камер
*/
syntax = "proto3";

package keyapis.vc.v1;

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/timestamp.proto";
import "keyapis/vc/v1/keyapis_vc_camera_v1.proto";

option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.Vc.V1";
option go_package = "/keyapis_vc_v1";
option java_multiple_files = false;
option java_outer_classname = "KeyapisVcV1Proto";
option java_package = "ru.keyapis.vc.v1";
option java_string_check_utf8 = true;
option objc_class_prefix = "KEYAPISVCV1";
option optimize_for = LITE_RUNTIME;
option php_namespace = "Keyapis\\Vc\\V1";
option ruby_package = "Keyapis::Vc::V1";

// Сервис управления видеоданными камер
service CameraVideoDataService {
  // Метод получения количества камер.
  // Для master это камеры, привязанные к пользователю, используем поля токена vc_user_id, user_id, company_id.
  // Для owner, employee это камеры, привязанные к компании, используем поле токена company_id.
  // Для admin, service, bti, ltp_first это камеры, привязанные к компании, используем поле scope.company_id.
  // Для admin, service, bti, ltp_first это камеры, привязанные к пользователю, используем поле scope.user_id.
  // Метод доступен для: admin, service, bti, ltp_first, master, owner, employee
  rpc GetCameraVideoDataCount (GetCameraVideoDataCountRequest) returns (GetCameraVideoDataCountResponse) {
    option (google.api.http) = {get: "/vc/api/v1/camera_video_data/count"};
  }
  // Метод получения списка камер.
  // Для master это камеры, привязанные к пользователю, используем поля токена vc_user_id, user_id, company_id.
  // Для owner, employee это камеры, привязанные к компании, используем поле токена company_id.
  // Для admin, service, bti, ltp_first это камеры, привязанные к компании, используем поле scope.company_id.
  // Для admin, service, bti, ltp_first это камеры, привязанные к пользователю, используем поле scope.user_id.
  // Метод доступен для: admin, service, bti, ltp_first, master, owner, employee
  rpc GetCameraVideoDataList (GetCameraVideoDataListRequest) returns (GetCameraVideoDataListResponse) {
    option (google.api.http) = {get: "/vc/api/v1/camera_video_data/list"};
  }
}
// Камера
message CameraVideoData {
  // Категория камеры
  message Category {
    // Идентификатор группы
    int32 id = 1 [(google.api.field_behavior) = REQUIRED];
    // Тип группы
    string type = 2 [(google.api.field_behavior) = REQUIRED];
    // Имя группы
    string title = 3 [(google.api.field_behavior) = REQUIRED];
  }
  // Координаты месторасположения
  message Location {
    // Широта
    double lat = 1 [(google.api.field_behavior) = REQUIRED];
    // Долгота
    double lng = 2 [(google.api.field_behavior) = REQUIRED];
  }
  // Статус камеры
  message Status {
    // Идентификатор статуса
    int32 id = 1 [(google.api.field_behavior) = REQUIRED];
    // online/offline
    string type = 2 [(google.api.field_behavior) = REQUIRED];
    // Доступна/Не доступна
    string title = 3 [(google.api.field_behavior) = REQUIRED];
  }
  // Идентификатор камеры в системе Видеокомфорт.
  // Тип: Guid
  string uid = 1 [(google.api.field_behavior) = REQUIRED];
  // Категория камеры
  Category category = 2;
  // Наименование камеры
  string title = 3 [(google.api.field_behavior) = REQUIRED];
  // Серийный номер камеры
  string serial_number = 4 [(google.api.field_behavior) = REQUIRED];
  // IP камеры
  string ip = 5 [(google.api.field_behavior) = REQUIRED];
  // Адрес видео-потока (https соединение)
  string streamer_url = 6 [(google.api.field_behavior) = REQUIRED];
  // MAC-адрес камеры
  string mac = 7 [(google.api.field_behavior) = REQUIRED];
  // Модель камеры
  string model = 8;
  // Производитель камеры
  string vendor = 9;
  // Статус камеры
  Status status = 10 [(google.api.field_behavior) = REQUIRED];
  // URL скриншотов разных размеров в JPG-формате
  string screenshot_url_template = 11 [(google.api.field_behavior) = REQUIRED];
  // Шаблон для “точных” скриншотов. Выдаёт скриншоты всех размеров
  string screenshot_precise_url_template = 12 [(google.api.field_behavior) = REQUIRED];
  // U-Токен, кука, которая выдается Умному Дому
  string user_token = 13 [(google.api.field_behavior) = REQUIRED];
  // Токен для воспроизведения видео с камеры
  string streamer_token = 14 [(google.api.field_behavior) = REQUIRED];
  // Токен для получения контента с cdn (например, файлов изображений)
  string screenshot_token = 15 [(google.api.field_behavior) = REQUIRED];
  // Глубина хранения видео в минутах
  int32 archive_length = 16;
  // Координаты месторасположения
  Location location = 17;
  // Дата создания
  google.protobuf.Timestamp created_at = 18 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Дата обновления
  google.protobuf.Timestamp updated_at = 19 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Смещение таймзоны в минутах.
  // # Диапазон: -720..840
  int32 utc_offset = 20; 
}
// Фильтр камер
message CameraVideoDataFilter {
  // Идентификатор камеры в системе Видеокомфорт.
  // Тип: Guid
  repeated string uids = 1;
  // Наименование камеры
  repeated string title = 2;
  // MAC-адрес камеры
  repeated string mac = 3;
  // IP камеры
  repeated string ip = 4;
  // Серийный номер камеры
  repeated string serial_number = 5;
    // Категория камеры
  repeated string category = 6;
}
// Постраничный вывод
message CameraVideoDataPaging {
  // Справочник типов направлений сортировки.
  // # Тип: byte
  enum DirectionType {
    // Значение не указано
    DIRECTION_TYPE_UNKNOWN = 0;
    // От большего к меньшему
    DESC = 1;
    // От меньшего к большему
    ASC = 2;
  }
  // Справочник типов значений сортировки.
  // # Тип: byte
  enum OrderByType {
    // Значение не указано
    ORDER_BY_TYPE_UNKNOWN = 0;
    // По дате создания
    CREATED_AT = 1;
  }
  // Тип значения сортировки.
  // Если значение не передано, то будет взято значение по умолчанию.
  // По умолчанию: UID
  OrderByType order_by_type = 1;
  // Тип направления сортировки.
  // # По умолчанию: DESC
  DirectionType direction_type = 2;
  // Количество записей на страницу.
  // Если значение 0 (не передано), то будет взято значение по умолчанию.
  // # Диапазон: 0..100.
  // # По умолчанию: 20
  int32 limit = 3;
  // Сдвиг.
  // # Диапазон: 0..2147483647
  int32 offset = 4;
}
// Ограничение выборки камер
message CameraVideoDataScope {
  oneof scope {
    // Идентификатор компании
    int64 company_id = 1;
    // Идентификатор пользователя
    int32 user_id = 2;
  }
}
// Запрос на получение количества камер
message GetCameraVideoDataCountRequest {
  // Ограничение выборки
  CameraVideoDataScope scope = 1;
  // Фильтр
  CameraVideoDataFilter filter = 2;
}
// Ответ на получение количества камер
message GetCameraVideoDataCountResponse {
  // Ошибка запроса
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип ответа
  oneof type {
    // Всего количество
    int32 data = 1;
    // Ошибка
    Error error = 2;
  }
}
// Запрос на получение списка камер
message GetCameraVideoDataListRequest {
  // Ограничение выборки
  CameraVideoDataScope scope = 1;
  // Фильтр
  CameraVideoDataFilter filter = 2;
  // Вариант разбиения на страницы
  oneof pagination {
    // Постраничный вывод
    CameraVideoDataPaging paging = 3;
  }
}
// Ответ на получение списка камер
message GetCameraVideoDataListResponse {
  // Ошибка запроса
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Камера
  repeated CameraVideoData data = 1;
  // Ошибка
  Error error = 2;
}

