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

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;

      return this.prereq.then(function() {
        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: ['...']}]
          ]));
        });
      });
    },

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

  privates: {
    advertise: function() {
      var self = this;

      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),
        this.prereq.then(function() {
          // TODO(rosswang): This seems wrong too.
          return self.vanadiumWrapper.setPermissions(self.sgAdmin, 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');

    /* TODO(rosswang): Once Vanadium supports global sync-group admin
     * creation, remove this. For now, use the first local SyncBase
     * instance to administrate. */
    this.prereq = vanadiumWrapper.mount(this.sgAdmin, syncbaseWrapper.mountName,
      vanadiumWrapper.multiMount.FAIL);

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

module.exports = GroupManager;