// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// TODO(sadovsky): Copy struct and interface comments from VDL files.

// TODO(sadovsky): This should probably be something else.
module mojo;

// TODO(sadovsky): Put structs in a separate types.mojom file.
// TODO(sadovsky): Loose representation of verror. Improve this.
struct Error {
  string id;  // empty string means no error
  uint32 action_code;
  string msg;
};

// TODO(sadovsky): Decide how to represent perms.
struct Perms {
  string json;
};

struct BatchOptions {
  string hint;
  bool read_only;
};

struct PrefixPerms {
  string prefix;
  Perms perms;
};

struct TableRow {
  string table_name;
  string row_prefix;
};

struct SyncgroupSpec {
  string description;
  Perms perms;
  array<TableRow> prefixes;
  array<string> mount_tables;
  bool is_private;
};

struct SyncgroupMemberInfo {
  uint8 sync_priority;
};

struct Result {
  array<array<uint8>> values;
};

// In this model, the server pushes one stream item to the client, then waits
// for an ack from the client before sending the next item, thus providing
// flow control.
interface ExecStream {
  OnResult(Result result) => ();
  OnDone(Error err);
};

struct KeyValue {
  string key;
  array<uint8> value;
};

// In this model, the server pushes one stream item to the client, then waits
// for an ack from the client before sending the next item, thus providing
// flow control.
interface ScanStream {
  OnKeyValue(KeyValue key_value) => ();
  OnDone(Error err);
};

struct WatchChange {
  string table_name;
  string row_key;
  uint32 change_type;
  array<uint8> value_bytes;
  array<uint8> resume_marker;
  bool from_sync;
  bool continued;
};

struct GlobRequest {
  string pattern;
  array<uint8> resume_marker;
};

// In this model, the server pushes one stream item to the client, then waits
// for an ack from the client before sending the next item, thus providing
// flow control.
interface WatchGlobStream {
  OnChange(WatchChange change) => ();
  OnError(Error err);
};

// TODO(sadovsky): Add schema version to all RPCs. See v.io/c/13734.
// All 'name' params are service-relative object names.

// Error handling modeled after:
// https://github.com/domokit/mojo/blob/master/mojo/services/files/public/interfaces/file.mojom
interface Syncbase {
  ////////////////////////////////////////
  // Service

  ServiceGetPermissions() => (Error err, Perms perms, string version);
  ServiceSetPermissions(Perms perms, string version) => (Error err);
  ServiceListApps() => (Error err, array<string> apps);

  ////////////////////////////////////////
  // App

  AppCreate(string name, Perms perms) => (Error err);
  AppDestroy(string name) => (Error err);
  AppExists(string name) => (Error err, bool exists);
  AppGetPermissions(string name) => (Error err, Perms perms, string version);
  AppListDatabases(string name) => (Error err, array<string> databases);
  AppSetPermissions(string name, Perms perms, string version) => (Error err);

  ////////////////////////////////////////
  // nosql.Database

  // TODO(sadovsky): Add SchemaMetadata argument.
  DbCreate(string name, Perms perms) => (Error err);
  DbDestroy(string name) => (Error err);
  DbExists(string name) => (Error err, bool exists);
  DbExec(string name, string query, ExecStream stream) => (Error err);
  DbBeginBatch(string name, BatchOptions? bo) => (Error err, string batch_suffix);
  DbCommit(string name) => (Error err);
  DbAbort(string name) => (Error err);
  DbGetPermissions(string name) => (Error err, Perms perms, string version);
  DbSetPermissions(string name, Perms perms, string version) => (Error err);
  DbWatchGlob(string name, GlobRequest req, WatchGlobStream stream) => (Error err);
  DbGetResumeMarker(string name) => (Error err, array<uint8> resumeMarker);
  DbListTables(string name) => (Error err, array<string> tables);

  // TODO(sadovsky): Add DatabaseWatcher, BlobManager, and SchemaManager
  // methods.

  ////////////////////////////////////////
  // nosql.Database:SyncgroupManager

  DbGetSyncgroupNames(string name) => (Error err, array<string> names);
  DbCreateSyncgroup(
      string name, string sg_name, SyncgroupSpec spec,
      SyncgroupMemberInfo my_info)
      => (Error err);
  DbJoinSyncgroup(string name, string sg_name, SyncgroupMemberInfo my_info)
      => (Error err, SyncgroupSpec spec);
  DbLeaveSyncgroup(string name, string sg_name) => (Error err);
  DbDestroySyncgroup(string name, string sg_name) => (Error err);
  DbEjectFromSyncgroup(string name, string sg_name, string member)
      => (Error err);
  DbGetSyncgroupSpec(string name, string sg_name)
      => (Error err, SyncgroupSpec spec, string version);
  DbSetSyncgroupSpec(
      string name, string sg_name, SyncgroupSpec spec, string version)
      => (Error err);
  DbGetSyncgroupMembers(string name, string sg_name)
      => (Error err, map<string, SyncgroupMemberInfo> infos);

  ////////////////////////////////////////
  // nosql.Table

  TableCreate(string name, Perms perms) => (Error err);
  TableDestroy(string name) => (Error err);
  TableExists(string name) => (Error err, bool exists);
  TableGetPermissions(string name) => (Error err, Perms perms);
  TableSetPermissions(string name, Perms perms) => (Error err);
  TableDeleteRange(string name, array<uint8> start, array<uint8> limit)
      => (Error err);
  TableScan(
      string name, array<uint8> start, array<uint8> limit, ScanStream stream)
      => (Error err);
  TableGetPrefixPermissions(string name, string key)
      => (Error err, array<PrefixPerms> perms_arr);
  TableSetPrefixPermissions(string name, string prefix, Perms perms) => (Error err);
  TableDeletePrefixPermissions(string name, string prefix) => (Error err);

  ////////////////////////////////////////
  // nosql.Row

  RowExists(string name) => (Error err, bool exists);
  RowGet(string name) => (Error err, array<uint8> value);
  RowPut(string name, array<uint8> value) => (Error err);
  RowDelete(string name) => (Error err);
};
