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

import 'dart:async';

import 'package:flutter/shell.dart' show shell;
import 'package:logging/logging.dart';
import 'package:syncbase/syncbase_client.dart';

import '../utils/errors.dart' as errorsutil;

export 'package:syncbase/syncbase_client.dart';

final Logger log = new Logger('syncbase/client');

const String syncbaseMojoUrl =
    'https://syncbase.syncslides.mojo.v.io/syncbase_server.mojo';
const appName = 'syncslides';
const dbName = 'syncslides';

SyncbaseDatabase database;

// Initializes Syncbase by creating the app and the database.
Future init() async {
  SyncbaseClient sbClient =
      new SyncbaseClient(shell.connectToService, syncbaseMojoUrl);
  SyncbaseApp sbApp = await _createApp(sbClient);
  database = await _createDb(sbApp);
}

Future createSyncgroup(
    String mounttable, String syncgroupName, prefixes) async {
  SyncbaseSyncgroup sg = database.syncgroup(syncgroupName);
  var sgSpec = SyncbaseClient.syncgroupSpec(prefixes,
      perms: createOpenPerms(), mountTables: [mounttable]);
  var myInfo = SyncbaseClient.syncgroupMemberInfo(syncPriority: 1);

  try {
    await sg.create(sgSpec, myInfo);
  } catch (e) {
    if (!errorsutil.isExistsError(e)) {
      throw e;
    }
  }

  log.info('Created syncgroup $syncgroupName');
}

Future joinSyncgroup(String syncgroupName) async {
  SyncbaseSyncgroup sg = database.syncgroup(syncgroupName);
  var myInfo = SyncbaseClient.syncgroupMemberInfo(syncPriority: 1);

  await sg.join(myInfo);
  log.info('Joined syncgroup $syncgroupName');
}

Future<SyncbaseApp> _createApp(SyncbaseClient sbClient) async {
  var app = sbClient.app(appName);
  try {
    await app.create(createOpenPerms());
  } catch (e) {
    if (!errorsutil.isExistsError(e)) {
      throw e;
    }
  }

  return app;
}

Future<SyncbaseDatabase> _createDb(SyncbaseApp app) async {
  var db = app.noSqlDatabase(dbName);
  try {
    await db.create(createOpenPerms());
  } catch (e) {
    if (!errorsutil.isExistsError(e)) {
      throw e;
    }
  }

  return db;
}

const String openPermsJson =
    '{"Admin":{"In":["..."]},"Write":{"In":["..."]},"Read":{"In":["..."]},"Resolve":{"In":["..."]},"Debug":{"In":["..."]}}"';
Perms createOpenPerms() {
  return SyncbaseClient.perms(openPermsJson);
}
