syntax = "proto3";

package tinkoff.public.invest.api.contract.v1;

option go_package = "./;investapi";
option java_package = "ru.tinkoff.piapi.contract.v1";
option java_multiple_files = true;
option csharp_namespace = "Tinkoff.InvestApi.V1";
option objc_class_prefix = "TIAPI";
option php_namespace = "Tinkoff\\Invest\\V1";

import "t_tech/invest/grpc/common.proto";
import "t_tech/invest/grpc/orders.proto";
import "t_tech/invest/grpc/operations.proto";
import "t_tech/invest/grpc/stoporders.proto";
import "t_tech/invest/grpc/users.proto";
import "t_tech/invest/grpc/google/api/field_behavior.proto";

service SandboxService { // Методы для работы с песочницей T-Invest API

  //OpenSandboxAccount — зарегистрировать счет
  rpc OpenSandboxAccount(OpenSandboxAccountRequest) returns (OpenSandboxAccountResponse);

  //GetSandboxAccounts — счета пользователя
  rpc GetSandboxAccounts(GetAccountsRequest) returns (GetAccountsResponse);

  //CloseSandboxAccount — закрыть счет
  rpc CloseSandboxAccount(CloseSandboxAccountRequest) returns (CloseSandboxAccountResponse);

  //PostSandboxOrder — выставить заявку
  rpc PostSandboxOrder(PostOrderRequest) returns (PostOrderResponse);

  //PostSandboxOrderAsync — выставить заявку асинхронным методом
  //Особенности работы приведены в [статье](/invest/services/orders/async).
  rpc PostSandboxOrderAsync(PostOrderAsyncRequest) returns (PostOrderAsyncResponse);

  //ReplaceSandboxOrder — изменить выставленную заявку
  rpc ReplaceSandboxOrder(ReplaceOrderRequest) returns (PostOrderResponse);

  //GetSandboxOrders — получить список активных заявок по счету
  rpc GetSandboxOrders(GetOrdersRequest) returns (GetOrdersResponse);

  //CancelSandboxOrder — отменить заявку
  rpc CancelSandboxOrder(CancelOrderRequest) returns (CancelOrderResponse);

  //GetSandboxOrderState — получить статус торгового поручения
  rpc GetSandboxOrderState(GetOrderStateRequest) returns (OrderState);

  //GetSandboxOrderPrice — получить предварительную стоимость для лимитной заявки
  rpc GetSandboxOrderPrice(GetOrderPriceRequest) returns (GetOrderPriceResponse);

  //GetSandboxPositions — список позиций по счету
  rpc GetSandboxPositions(PositionsRequest) returns (PositionsResponse);

  //GetSandboxOperations — список операций по счету
  //При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
  rpc GetSandboxOperations(OperationsRequest) returns (OperationsResponse);

  //GetSandboxOperationsByCursor — список операций по счету с пагинацией
  //При работе с методом учитывайте [особенности взаимодействия](/invest/services/operations/operations_problems).
  rpc GetSandboxOperationsByCursor(GetOperationsByCursorRequest) returns (GetOperationsByCursorResponse);

  //GetSandboxPortfolio — портфель по счету
  rpc GetSandboxPortfolio(PortfolioRequest) returns (PortfolioResponse);

  //SandboxPayIn — пополнить счет.
  rpc SandboxPayIn(SandboxPayInRequest) returns (SandboxPayInResponse);

  //GetSandboxWithdrawLimits — доступный остаток для вывода средств
  rpc GetSandboxWithdrawLimits(WithdrawLimitsRequest) returns (WithdrawLimitsResponse);

  //GetSandboxMaxLots — расчет количества доступных для покупки/продажи лотов
  rpc GetSandboxMaxLots(GetMaxLotsRequest) returns (GetMaxLotsResponse);

  //PostSandboxStopOrder — выставить стоп-заявку
  rpc PostSandboxStopOrder(PostStopOrderRequest) returns (PostStopOrderResponse);

  //GetSandboxStopOrders — получить список активных стоп-заявок по счету
  rpc GetSandboxStopOrders(GetStopOrdersRequest) returns (GetStopOrdersResponse);

  //CancelSandboxStopOrder — отменить стоп-заявку
  rpc CancelSandboxStopOrder(CancelStopOrderRequest) returns (CancelStopOrderResponse);
}

//Запрос открытия счета в песочнице.
message OpenSandboxAccountRequest {
  optional string name = 1; // Название счета
}

//Номер открытого счета в песочнице.
message OpenSandboxAccountResponse {
  string account_id = 1; //Номер счета
}

//Запрос закрытия счета в песочнице.
message CloseSandboxAccountRequest {
  string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета
}

//Результат закрытия счета в песочнице.
message CloseSandboxAccountResponse {
  //пустой ответ
}

//Запрос пополнения счета в песочнице.
message SandboxPayInRequest {
  string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета
  MoneyValue amount = 2 [(google.api.field_behavior) = REQUIRED]; //Сумма пополнения счета в рублях
}

//Результат пополнения счета, текущий баланс.
message SandboxPayInResponse {
  MoneyValue balance = 1; //Текущий баланс счета
}
