// 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.

part of syncbase_client;

// TODO(sadovsky): Why are all these class names prefixed with "Syncbase"?
class SyncbaseApp extends NamedResource {
  // NOTE(sadovsky): For the Mojo Syncbase service, we only store names from app
  // down - i.e. there is no service name.
  SyncbaseApp._internal(_ctx, relativeName)
      : super._internal(_ctx, null, relativeName, escape(relativeName));

  // noSqlDatabase returns a database with the given relativeName.
  SyncbaseDatabase noSqlDatabase(String relativeName) {
    return new SyncbaseDatabase._internal(_ctx, fullName, relativeName);
  }

  Future<List<String>> listDatabases() async {
    var v = await _ctx.syncbase.appListDatabases(fullName);
    if (isError(v.err)) throw v.err;
    return v.databases;
  }

  Future create(mojom.Perms perms) async {
    var v = await _ctx.syncbase.appCreate(fullName, perms);
    if (isError(v.err)) throw v.err;
  }

  Future destroy() async {
    var v = await _ctx.syncbase.appDestroy(fullName);
    if (isError(v.err)) throw v.err;
  }

  Future<bool> exists() async {
    var v = await _ctx.syncbase.appExists(fullName);
    if (isError(v.err)) throw v.err;
    return v.exists;
  }

  Future<mojom.Perms> getPermissions() async {
    var v = await _ctx.syncbase.appGetPermissions(fullName);
    if (isError(v.err)) throw v.err;
    // TODO(nlacasse): We need to return the version too.  Create a struct type
    // that combines perms and version?
    return v.perms;
  }

  Future setPermissions(mojom.Perms perms, String version) async {
    var v = await _ctx.syncbase.appSetPermissions(fullName, perms, version);
    if (isError(v.err)) throw v.err;
  }
}
