/*
  Сервис управления реле устройства
*/
syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/field_mask.proto";
import "deviceapis/device/v1/deviceapis_device_common_v1.proto";
import "protoc-gen-openapiv2/options/annotations.proto";

package deviceapis.device.v1;

option java_package = "ru.deviceapis.device.v1";
option java_outer_classname = "DeviceapisDeviceV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/deviceapis_device_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Deviceapis.Device.V1";
option objc_class_prefix = "DEVICEAPISDEVICEV1";
option php_namespace = "Deviceapis\\Device\\V1";
option ruby_package = "Deviceapis::Device::V1";
option optimize_for = LITE_RUNTIME;

// Сервис управления реле устройства
service RelayService {
  // Метод закрытия реле.
  // Закрытие реле принудительно без учета времени открытия.
  // Отмена режима постоянного открытия
  rpc PostRelayClose(PostRelayCloseRequest) returns (PostRelayCloseResponse) {
    option (google.api.http) = {
      post: "/device/api/v1/relay/{relay_index}/close"
    };
  }
  // Метод открытия реле
  rpc PostRelayOpen(PostRelayOpenRequest) returns (PostRelayOpenResponse) {
    option (google.api.http) = {
      post: "/device/api/v1/relay/{relay_index}/open"
      body: "*"
    };
  }
  // Метод открытия реле без дальнейшего закрытия
  rpc PostRelayOpenPermanently(PostRelayOpenPermanentlyRequest) returns (PostRelayOpenPermanentlyResponse) {
    option (google.api.http) = {
      post: "/device/api/v1/relay/{relay_index}/open_permanently"
    };
  }
  // Метод редактирования настроек открытия реле
  rpc EditRelayPropsOpen(EditRelayPropsOpenRequest) returns (EditRelayPropsOpenResponse) {
    option (google.api.http) = {
      patch: "/device/api/v1/relay/{data.relay_index}/props/open"
      body: "data"
    };
  }
  // Метод получения настроек открытия реле
  rpc GetRelayOpenList(GetRelayOpenListRequest) returns (GetRelayOpenListResponse) {
    option (google.api.http) = {
      get: "/device/api/v1/relay/open/list"
    };
  }
  // Метод редактирования настроек DTMF реле
  rpc EditRelayPropsDtmf(EditRelayPropsDtmfRequest) returns (EditRelayPropsDtmfResponse) {
    option (google.api.http) = {
      patch: "/device/api/v1/relay/{data.relay_index}/props/dtmf"
      body: "data"
    };
  }
  // Метод получения настроек DTMF реле
  rpc GetRelayDtmfList(GetRelayDtmfListRequest) returns (GetRelayDtmfListResponse) {
    option (google.api.http) = {
      get: "/device/api/v1/relay/dtmf/list"
    };
  }
  // Метод получения статусов реле устройства
  rpc GetRelayStatusList(GetRelayStatusListRequest) returns (GetRelayStatusListResponse) {
    option (google.api.http) = {
      get: "/device/api/v1/relay/status/list"
    };
  }
}

// Запрос закрытия реле
message PostRelayCloseRequest {
  // Индекс реле.
  // Диапазон: 1..32767
  int32 relay_index = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 32767,
      example: "1"
    }
  ];
}

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

// Запрос открытия реле без дальнейшего закрытия
message PostRelayOpenPermanentlyRequest {
  // Индекс реле.
  // Диапазон: 1..32767
  int32 relay_index = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 32767,
      example: "1"
    }
  ];
}

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

// Запрос открытия реле
message PostRelayOpenRequest {
  // Индекс реле.
  // Диапазон: 1..32767
  int32 relay_index = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 32767,
      example: "1"
    }
  ];
  // Задержка в секундах.
  // Если не передано, используется установленное значение времени открытия из настроек.
  // Диапазон: 1..200
  int32 current_open_time = 2 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 200,
      example: "10"
    }
  ];
}

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

// Запрос редактирования настроек открытия реле
message EditRelayPropsOpenRequest {
  // Настройки реле
  RelayOpen data = 1 [(google.api.field_behavior) = REQUIRED];
  // Маска полей обновления
  google.protobuf.FieldMask update_mask = 2;
}

// Запрос на установку настроек DTMF реле
message EditRelayPropsDtmfRequest {
  // Настройки DTMF реле
  RelayDtmf data = 1 [(google.api.field_behavior) = REQUIRED];
  // Маска полей обновления
  google.protobuf.FieldMask update_mask = 2;
}


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

// Ответ на запрос на установку настроек DTMF
message EditRelayPropsDtmfResponse {
  // Ошибка запроса на установку настроек DTMF
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип ответа
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос получения статусов реле устройства
message GetRelayStatusListRequest {}

// Состояние реле
message RelayState {
  // Индекс реле.
  // Диапазон: 1..32767
  int32 relay_index = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 32767,
      example: "1"
    }
  ];
  // Тип состояния
  enum StateType {
    // Значение не указано
    STATE_TYPE_UNKNOWN = 0;
    // Открыто временно
    OPEN_TEMPORARY = 1;
    // Закрыто
    CLOSED = 2;
    // Открыто на всегда
    OPEN_PERMANENT = 3;
  }
  // Состояние
  StateType state_type = 2 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"CLOSED\""
    }
  ];
}

// Ответ на запрос получения статусов реле устройства
message GetRelayStatusListResponse {
  // Список состояний реле
  repeated RelayState data = 1;
}

// Запрос получения настроек открытия реле
message GetRelayOpenListRequest {}

// Запрос получения настроек DTMF реле
message GetRelayDtmfListRequest {}

// Настройки открытия реле
message RelayOpen {
  // Индекс реле.
  // Диапазон: 1..32767
  int32 relay_index = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 32767,
      example: "1"
    }
  ];
  // Тип замка
  enum LockType {
    // Значение не указано
    LOCK_TYPE_UNKNOWN = 0;
    // Электромагнитный (state_operation)
    ELECTROMAGNETIC = 1;
    // Электромеханический (pulse_operation)
    ELECTROMECHANICAL = 2;
  }
  // Тип замка
  LockType lock_type = 2 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"ELECTROMAGNETIC\""
    }
  ];
  // Общее время открытия.
  // Диапазон: 1..200
  int32 open_time_general = 3 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 200,
      example: "10"
    }
  ];
  // Время открытия в секундах при экстренном оповещении.
  // При 0 - до конца экстренного оповещения.
  // Диапазон: 0..3600
  int32 open_time_emergency = 4 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 0,
      maximum: 3600,
      example: "10"
    }
  ];
}

// Ответ на запрос получения настроек открытия реле
message GetRelayOpenListResponse {
  // Настройки открытия реле
  repeated RelayOpen data = 1;
}

// Настройки DTMF реле
message RelayDtmf {
  // Индекс реле.
  // Диапазон: 1..32767
  int32 relay_index = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 32767,
      example: "1"
    }
  ];
  // DTMF код.
  // Для разных реле допускается одинаковый DTMF код.
  // Один символ из 0,1,2,3,4,5,6,7,8,9,*,#
  string dtmf_code = 2 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      min_length: 1,
      max_length: 1,
      pattern: "^[0-9*#]{1,1}$",
      example: "5"
    }
  ];
}

// Ответ на запрос получения настроек DTMF реле
message GetRelayDtmfListResponse {
  // Настройки DTMF реле
  repeated RelayDtmf data = 1;
}
