// This file is part of arduino-cli.
//
// Copyright 2020 ARDUINO SA (http://www.arduino.cc/)
//
// This software is released under the GNU General Public License version 3,
// which covers the main part of arduino-cli.
// The terms of this license can be found at:
// https://www.gnu.org/licenses/gpl-3.0.en.html
//
// You can be released from the requirements of the above licenses by purchasing
// a commercial license. Buying such a license is mandatory if you want to
// modify or otherwise use the software for commercial activities involving the
// Arduino software without disclosing the source code of your own applications.
// To purchase a commercial license, send an email to license@arduino.cc.

syntax = "proto3";

package cc.arduino.cli.commands;

option go_package = "github.com/arduino/arduino-cli/rpc/commands";

import "commands/common.proto";
import "commands/board.proto";
import "commands/compile.proto";
import "commands/core.proto";
import "commands/upload.proto";
import "commands/lib.proto";

// The main Arduino Platform Service
service ArduinoCore {
  // BOOTSTRAP COMMANDS
  //-------------------

  // Start a new instance of the Arduino Core Service
  rpc Init(InitReq) returns (stream InitResp) {}

  // Destroy an instance of the Arduino Core Service
  rpc Destroy(DestroyReq) returns (DestroyResp) {}

  // Rescan instance of the Arduino Core Service
  rpc Rescan(RescanReq) returns (RescanResp) {}

  // Update package index of the Arduino Core Service
  rpc UpdateIndex(UpdateIndexReq) returns (stream UpdateIndexResp) {}

  // Update libraries index
  rpc UpdateLibrariesIndex(UpdateLibrariesIndexReq) returns (stream UpdateLibrariesIndexResp) {}

  // Get the version of Arduino CLI in use.
  rpc Version(VersionReq) returns (VersionResp) {}

  // BOARD COMMANDS
  // --------------

  // Requests details about a board
  rpc BoardDetails(BoardDetailsReq) returns (BoardDetailsResp);

  // Attach a board to a sketch. When the `fqbn` field of a request is not 
  // provided, the FQBN of the attached board will be used.
  rpc BoardAttach(BoardAttachReq) returns (stream BoardAttachResp);

  // List the boards currently connected to the computer.
  rpc BoardList(BoardListReq) returns (BoardListResp);

  // List all the boards provided by installed platforms.
  rpc BoardListAll(BoardListAllReq) returns (BoardListAllResp);

  // Compile an Arduino sketch.
  rpc Compile(CompileReq) returns (stream CompileResp);

  // Download and install a platform and its tool dependencies.
  rpc PlatformInstall(PlatformInstallReq) returns (stream PlatformInstallResp);

  // Download a platform and its tool dependencies to the `staging/packages`
  // subdirectory of the data directory.
  rpc PlatformDownload(PlatformDownloadReq) returns (stream PlatformDownloadResp);

  // Uninstall a platform as well as its tool dependencies that are not used by
  // other installed platforms.
  rpc PlatformUninstall(PlatformUninstallReq) returns (stream PlatformUninstallResp);

  // Upgrade an installed platform to the latest version.
  rpc PlatformUpgrade(PlatformUpgradeReq) returns (stream PlatformUpgradeResp);

  // Upload a compiled sketch to an Arduino board.
  rpc Upload(UploadReq) returns (stream UploadResp);

  // Search for a platform in the platforms indexes.
  rpc PlatformSearch(PlatformSearchReq) returns (PlatformSearchResp);

  // List all installed platforms.
  rpc PlatformList(PlatformListReq) returns (PlatformListResp);

  rpc LibraryDownload(LibraryDownloadReq) returns (stream LibraryDownloadResp);

  rpc LibraryInstall(LibraryInstallReq) returns (stream LibraryInstallResp);

  rpc LibraryUninstall(LibraryUninstallReq) returns (stream LibraryUninstallResp);

  rpc LibraryUpgradeAll(LibraryUpgradeAllReq) returns (stream LibraryUpgradeAllResp);

  rpc LibraryResolveDependencies(LibraryResolveDependenciesReq) returns (LibraryResolveDependenciesResp);

  rpc LibrarySearch(LibrarySearchReq) returns (LibrarySearchResp);

  rpc LibraryList(LibraryListReq) returns (LibraryListResp);
}

message InitReq {
  // Start a Arduino Core Service instance that will provide only Library
  // Manager functionality.
  bool library_manager_only = 2;
}

message InitResp {
  // An Arduino Core Service instance.
  Instance instance = 1;
  // Error messages related to any problems encountered while parsing the
  // platforms index files.
  repeated string platforms_index_errors = 2;
  // Error message if a problem was encountered while parsing the libraries
  // index file.
  string libraries_index_error = 3;
  // Progress of the downloads of platforms and libraries index files.
  DownloadProgress download_progress = 4;
  // Describes the current stage of the initialization.
  TaskProgress task_progress = 5;
}

message DestroyReq {
  // The Arduino Core Service instance to destroy.
  Instance instance = 1;
}
message DestroyResp {}

message RescanReq {
  // Arduino Core Service instance from the Init response.
  Instance instance = 1;
}

message RescanResp {
  // Error messages related to any problems encountered while parsing the
  // platforms index file.
  repeated string platforms_index_errors = 1;
  // Error message if a problem was encountered while parsing the libraries
  // index file.
  string libraries_index_error = 2;
}

message UpdateIndexReq {
  // Arduino Core Service instance from the Init response.
	Instance instance = 1;
}

message UpdateIndexResp {
  // Progress of the platforms index download.
  DownloadProgress download_progress = 1;
}

message UpdateLibrariesIndexReq {
  // Arduino Core Service instance from the Init response.
	Instance instance = 1;
}

message UpdateLibrariesIndexResp {
  // Progress of the libraries index download.
  DownloadProgress download_progress = 1;
}

message VersionReq {}

message VersionResp {
  // The version of Arduino CLI in use.
  string version = 1;
}
