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

require('es6-shim');

var vanadium = require('vanadium');

var defineClass = require('./util/define-class');
var naming = require('./naming');

var GroupManager = defineClass({
  publics: {
    createSyncGroup: function(name, prefixes) {
      var self = this;

      var sg = self.syncbaseWrapper.syncGroup(self.sgAdmin, name);

      var mgmt = vanadium.naming.join(self.mountNames.app, 'sgmt', name);
      var spec = sg.buildSpec(prefixes, [mgmt]);

      /* TODO(rosswang): Right now, duplicate SyncBase creates on
       * different SyncBase instances results in siloed SyncGroups.
       * Revisit this logic once it merges properly. */
      return sg.joinOrCreate(spec).then(function() {
        // TODO(rosswang): this is a hack to make the syncgroup joinable
        return self.vanadiumWrapper.setPermissions(mgmt, new Map([
          ['Admin', {in: ['...']}],
          ['Read', {in: ['...']}],
          ['Resolve', {in: ['...']}]
        ]));
      }).then(function() {
        return sg;
      });
    },

    destroySyncGroup: function(name) {
      return this.syncbaseWrapper.syncGroup(this.sgAdmin, name).destroy();
    },

    joinSyncGroup: function(owner, name) {
      var sg = this.syncbaseWrapper.syncGroup(
        vanadium.naming.join(naming.appMount(owner), 'sgadmin'), name);
      return sg.join();
    }
  },

  privates: {
    advertise: function() {
      var basicPerms = new Map([
        ['Admin', {in: [this.identity.account]}],
        ['Read', {in: ['...']}],
        ['Resolve', {in: ['...']}]
      ]);

      return Promise.all([
        /* TODO(rosswang): this is a very short term hack just because user
         * mount names on ns.dev.v.io don't yet default to Resolve in [...].
         */
        this.vanadiumWrapper.setPermissions(this.mountNames.user, basicPerms),
        this.vanadiumWrapper.setPermissions(this.mountNames.app, basicPerms)
      ]);
    }
  },

  constants: [ 'sgAdmin', 'syncbaseWrapper' ],

  events: {
    onError: 'memory'
  },

  init: function(identity, vanadiumWrapper, syncbaseWrapper, mountNames) {
    this.identity = identity;
    this.vanadiumWrapper = vanadiumWrapper;
    this.syncbaseWrapper = syncbaseWrapper;
    this.mountNames = mountNames;

    this.sgAdmin = vanadium.naming.join(mountNames.app, 'sgadmin');

    this.advertise().catch(this.onError);
  }
});

module.exports = GroupManager;