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

import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/wrappers.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;

// Сервис управления Sip
service SipService {
  // Метод редактирования Sip-аккаунта
  rpc EditSipAccount(EditSipAccountRequest) returns (EditSipAccountResponse) {
    option (google.api.http) = {
      patch: "/device/api/v1/sip/account/{data.account_id}"
      body: "data"
    };
  }
  // Метод получения списка Sip-аккаунтов
  rpc GetSipAccountList(GetSipAccountListRequest) returns (GetSipAccountListResponse) {
    option (google.api.http) = {
      get: "/device/api/v1/sip/account/list"
    };
  }
  // Метод редактирования настроек максимального времени общения и дозвона
  rpc EditSipTimeoutSettings(EditSipTimeoutSettingsRequest) returns (EditSipTimeoutSettingsResponse) {
    option (google.api.http) = {
      patch: "/device/api/v1/sip/timeout/settings"
      body: "data"
    };
  }
  // Метод получения настроек максимального времени общения и дозвона
  rpc GetSipTimeoutSettings(GetSipTimeoutSettingsRequest) returns (GetSipTimeoutSettingsResponse) {
    option (google.api.http) = {
      get: "/device/api/v1/sip/timeout/settings"
    };
  }
  // Метод получения статусов регистрации Sip-аккаунтов
  rpc GetSipAccountStatusList(GetSipAccountStatusListRequest) returns (GetSipAccountStatusListResponse) {
    option (google.api.http) = {
      get: "/device/api/v1/sip/account/status/list"
    };
  }
}

// Запрос получения списка Sip-аккаунтов
message GetSipAccountListRequest {}

// Ответ на запрос получения списка Sip-аккаунтов
message GetSipAccountListResponse {
  // Массив Sip-аккаунтов
  repeated SipAccount data = 1;
}

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


//Sip-аккаунт
message SipAccount {
  // ID Sip-аккаунта
  string account_id = 1 [
    (google.api.field_behavior) = REQUIRED,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"1454647\""
    }
  ];
  // Имя
  google.protobuf.StringValue name = 2 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"0018155318002\""
    }
  ];
  // Номер
  google.protobuf.StringValue number = 3 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"45464738\""
    }
  ];
  // Имя пользователя
  google.protobuf.StringValue user = 4 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"admin\""
    }
  ];
  // Пароль.
  // Не возвращается с сервера.
  // TODO: в генерации сваггера не показывать INPUT_ONLY поля в ответах
  google.protobuf.StringValue password = 5 [
    (google.api.field_behavior) = INPUT_ONLY,
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"pwd_admin\""
    }
  ];
  // Адрес REG-сервера.
  // Сетевой адрес и порт.
  // Пример: 192.168.0.1:5060, reg.acme.io:5060
  google.protobuf.StringValue reg_server_address = 6 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"reg.acme.io:5060\"",
      min_length: 5
    }
  ];
  // Адрес SIP-сервера.
  // Сетевой адрес и порт.
  // Пример: 192.168.0.1:5060, sip.acme.io:5060
  google.protobuf.StringValue sip_server_address = 7 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"sip.acme.io:5060\"",
      min_length: 5
    }
  ];
  // Адрес SIP-прокси.
  // Сетевой адрес и порт.
  // Пример: 192.168.0.1:5060, proxy.acme.io:5060
  google.protobuf.StringValue sip_proxy_address = 8 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      example: "\"proxy.acme.io:5060\"",
      min_length: 5
    }
  ];
}

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

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

// Ответ на запрос получения настроек максимального времени общения и дозвона
message GetSipTimeoutSettingsResponse {
  // Тип ответа
  oneof type {
    // Настройки максимального времени общения и дозвона
    SipTimeoutSettings data = 1;
  }
}


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


// Настройки максимального времени общения и дозвона
message SipTimeoutSettings {
  // Максимальное время дозвона в секундах
  int32 call_timeout = 1 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 2000,
      example: "100"
    }
  ];
  // Максимальное время общения в секундах
  int32 talk_timeout = 2 [
    (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
      minimum: 1,
      maximum: 2000,
      example: "100"
    }
  ];
}

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

// Запрос получения статусов регистрации Sip-аккаунтов
message GetSipAccountStatusListRequest {}

// Ответ на запрос получения статусов регистрации Sip-аккаунтов
message GetSipAccountStatusListResponse {
  // Статус аккаунтов Sip
  message SipStatus {
    // Тип состояния Sip-аккаунта
    enum StateType {
      // Значение не указано
      STATE_TYPE_UNKNOWN = 0;
      // Клиент отправил REGISTER запрос, но ответ от сервера ещё не получен.
      // Идёт попытка регистрации
      REGISTERING = 1;
      // Успешная регистрация.
      // SIP-сервер подтвердил регистрацию, клиент готов принимать звонки
      REGISTERED = 2;
      // Клиент отключился или не регистрировался.
      // Возможные причины: Клиент отправил UNREGISTER; Истек срок регистрации (expires)
      UNREGISTERED = 3;
      // Ошибка при попытке регистрации.
      // Возможные причины: Неверный логин/пароль; SIP-сервер недоступен; Ошибка в конфигурации (порт, протокол, IP)
      REGISTRATION_FAILED = 4;
      // Нет ответа от сервера в течение времени ожидания.
      // Возможные причины: Проблемы с сетью; SIP-сервер не отвечает; Нет ответа от сервера в течение времени ожидания
      TIMEOUT = 5;
      // SIP клиент остановлен вручную или отключён по конфигурации.
      // Не выполняется даже попытка регистрации
      DISABLED = 6;
    }
    // ID Sip-аккаунта
    string sip_account_id = 1 [
      (google.api.field_behavior) = REQUIRED,
      (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
        example: "\"1454647\""
      }
    ];
    // Статус регистрации Sip
    StateType state_type = 2 [
      (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
        example: "\"REGISTERED\""
      }
    ];
    // Дата последней попытки регистрации UnixTime
    int32 last_attempt_register_at = 3 [
      (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
        minimum: 0,
        example: "1742560844",
        format: "UnixTime"
      }
    ];
  }
  // Статус аккаунтов Sip
  repeated SipStatus data = 1;
}

