/*
  Сервис реализует функционал взаимодействия с внешними партнёрами IoT со стороны партнера
*/
syntax = "proto3";

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

package keyapis.iot_connect.v1;

option java_package = "ru.keyapis.iot_connect.v1";
option java_outer_classname = "KeyapisIotConnectV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_iot_connect_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.IotConnect.V1";
option objc_class_prefix = "KEYAPISIOTCONNECTV1";
option php_namespace = "Keyapis\\IotConnect\\V1";
option ruby_package = "Keyapis::IotConnect::V1";
option optimize_for = LITE_RUNTIME;

// Сервис для взаимодействия с внешними партнёрами IoT со стороны партнера
service IotConnectCallbackService{
  // Метод получения пользователя для соединения аккаунтов.
  // Идентификатор пользователя - это subject из токена.
  // Метод доступен для: TokenACF: Scope: sber_iot
  rpc GetCallbackUser(GetCallbackUserRequest) returns (GetCallbackUserResponse)
  {
    option (google.api.http) = {
      get: "/iot_connect/api/v1/callback/user"
    };
  }
  // Метод разъединения аккаунтов.
  // Идентификатор пользователя - это subject из токена.
  // Метод доступен для: TokenACF: Scope: sber_iot
  rpc PostCallbackUnlink(PostCallbackUnlinkRequest) returns (PostCallbackUnlinkResponse)
  {
    option (google.api.http) = {
      post: "/iot_connect/api/v1/callback/unlink"
    };
  }
  // Метод получения устройств, доступных пользователю.
  // Идентификатор пользователя - это subject из токена.
  // Метод доступен для: TokenACF: Scope: sber_iot
  rpc GetCallbackDevices(GetCallbackDevicesRequest) returns (GetCallbackDevicesResponse)
  {
    option (google.api.http) = {
      get: "/iot_connect/api/v1/callback/devices"
    };
  }

  // Зачем.
  // Метод получения состояния устройства.
  // Идентификатор пользователя - это subject из токена.
  // Метод доступен для: TokenACF: Scope: sber_iot
  rpc PostCallbackQuery(PostCallbackQueryRequest) returns (PostCallbackQueryResponse)
  {
    option (google.api.http) = {
      post: "/iot_connect/api/v1/callback/query"
      body: "*"
    };
  }
  // Метод запроса внешнего IoT партнёра на изменение состояния устройства.
  // Поддерживается только открытие домофона.
  // Метод доступен для: TokenACF: Scope: sber_iot
  rpc PostCallbackCommand(PostCallbackCommandRequest) returns (PostCallbackCommandResponse)
  {
    option (google.api.http) = {
      post: "/iot_connect/api/v1/callback/command"
    };
  }
}

// Запрос метода получения пользователя для соединения аккаунтов
message GetCallbackUserRequest {
}

// Ответ на запрос метода получения пользователя для соединения аккаунтов
message GetCallbackUserResponse {
  // Идентификатор пользователя
  int32 data = 1 [json_name = "user_id"];
}

// Объект Модель устройства
message Model {
  // Список функций устройства
  enum FeatureType {
    // Значение не указано
    FEATURE_TYPE_UNKNOWN = 0;
    // Сигнализация о поступившем звонке
    INCOMING_CALL = 1;
    // Сигнализация о доступности устройства
    ONLINE = 2;
    // Отклонение звонка
    REJECT_CALL = 3;
    // Открытие замка
    UNLOCK = 4;
  }
  // Идентификатор модели
  string id = 1;
  // Производитель
  string manufacturer = 2;
  // Название модели
  string model = 3;
  // Версия оборудования
  string hw_version = 4;
  // Версия прошивки
  string sw_version = 5;
  // Описание
  string description = 6;
  // Категория устройства
  string category = 7;
  // Список функций
  repeated FeatureType feature_types = 8 [json_name = "features"];
}

// Объект устройства
message Device {
  // Идентификатор устройства на платформе Ключ.
  // Конкатенация user_id и device_id плафтормы Ключ
  string id = 1;
  // Название устройства на платформе Ключ
  string name = 2;
  // Название устройства от производителя
  string default_name = 3;
  // Адрес дома, где установлено устройство
  string home = 4;
  // Название или номер подъезда
  string room = 5;
  // Тип устройства
  Model model = 6;
  // HW версия устройства
  string hw_version = 7;
  // SW версия устройства
  string sw_version = 8;
}

// Массив статусов устройства
message DeviceStateArray {
  // Статусы устройства
  repeated DeviceState states = 1;
}

// Массив команд на изменение статуса устройства
message DeviceCommandArray {
  // Команды на изменение статуса устройства
  repeated DeviceCommand states = 1;
}

// Команды на изменение статуса устройства
message DeviceCommand {
  // Список ключей команд на изменение статуса устройства
  enum KeyType {
    // Значение не указано
    KEY_TYPE_UNKNOWN = 0;
    // Отклонение звонка
    REJECT_CALL = 1;
    // Открытие замка
    UNLOCK = 2;
  }
  // Значение команды на изменение статуса устройства
  message Value {
    // Тип значения команд на изменение статуса устройства
    enum Type {
      // Значение не указано
      TYPE_UNKNOWN = 0;
      // Перечисление
      ENUM = 1;
    }
    // Значения команд на изменение статуса устройства типа перечисление
    enum ValueEnumType {
      // Значение не указано
      VALUE_ENUM_TYPE_UNKNOWN = 0;
      // Отклонение звонка
      REJECT = 1;
      // Открытие замка
      UNLOCK = 2;
    }
    // Тип значения команды на изменение статуса устройства
    Type type = 1;
    // Значение команды на изменение статуса устройства
    oneof value {
      // Значения команды на изменение статуса устройства типа перечисление
      ValueEnumType value_enum_type = 2 [json_name = "enum_value"];
    }
  }
  // Тип команды на изменение статуса устройства
  KeyType command_key_type = 1 [json_name = "key"];
  // Значение команды на изменение статуса устройства
  Value value = 2;
}


// Статус устройства
message DeviceState {
  // Список ключей статусов устройства
  enum KeyType {
    // Значение не указано
    KEY_TYPE_UNKNOWN = 0;
    // Статус доступности устройства
    ONLINE = 1;
  }
  // Значение статуса устройства
  message Value {
    // Тип значения статуса устройства
    enum Type {
      // Значение не указано
      TYPE_UNKNOWN = 0;
      // Логический тип
      BOOL = 1;
    }
    // Тип значения статуса устройства
    Type type = 1;
    // Значение статуса устройства
    oneof value {
      // Значение логического типа
      bool is_value = 2 [json_name = "bool_value"];
    }
  }
  // Тип статуса устройства
  KeyType state_key_type = 1 [json_name = "key"];
  // Значение статуса устройства
  Value value = 2;
}

// Запрос метода получения устройств, доступных пользователю
message GetCallbackDevicesRequest {
}

// Ответ на запрос метода получения устройств, доступных пользователю
message GetCallbackDevicesResponse {
  // Домофоны, доступные пользователю
  repeated Device data = 1;
}

// Запрос статуса домофонов пользователя
message PostCallbackQueryRequest {
  // Массив идентификаторов домофонов пользователя
  repeated string devices = 1;
}

// Ответ на запрос статуса домофонов пользователя
message PostCallbackQueryResponse {
  // Массив домофонов со статусами
  map<string, DeviceStateArray> data = 1 [json_name = "devices"];
}

// Запрос на изменение статуса домофона
message PostCallbackCommandRequest{
  // Массив домофонов со статусами
  map<string, DeviceCommandArray> devices = 1;
}

// Ответ на запрос на изменение статуса домофона
message PostCallbackCommandResponse{
}

// Запрос метода разъединения аккаунтов
message PostCallbackUnlinkRequest {
}

// Ответ на запрос метода разъединения аккаунтов
message PostCallbackUnlinkResponse {
}
