// 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 bookmarkService = require('./services/bookmarks/service');

var store = require('./lib/store');
var log = require('./lib/log')('onboarding');

module.exports = onboarding;

// When a new user visits the namespace browser, do a simple onboarding.
function onboarding(rt, appState) {
  store.getValue('returning_user').then(function(returning) {
    if (!returning) {
      log.debug('Welcome to the Vanadium Namespace Browser!');
      addDefaultBookmarks(rt);

      // TODO(alexfandrianto): We can improve the onboarding experience
      // By changing the appState variable, we can do other things to help a new
      // user learn the Namespace Browser.
      completeOnboarding();
    }
  }).catch(function(err) {
    log.error('Failed to get "returning_user" flag', err);
  });
}

// Add default bookmarks to the user's store.
function addDefaultBookmarks(rt) {
  function bookmarkFail(err) {
    log.warn('Could not add default bookmark', err);
  }

  var email = getEmailFromAccountName(rt.accountName);

  // Determine the default bookmarks.
  var globalMT = '/ns.dev.v.io:8101';
  var personal;
  if (email) {
    // Point to their personal section of the global namespace.
    personal = globalMT + '/users/' + email;
  }

  // If the bookmark already exists, then Mercury's observ-array will add it a
  // 2nd time, so check if it's already bookmarked.
  // Avoid racing bookmarks. Make sure to add them consecutively to the store.
  bookmarkService.isBookmarked(globalMT).then(function(isGlobalMT) {
    if (!isGlobalMT) {
      bookmarkService.bookmark(globalMT, true);
    }
  }).catch(bookmarkFail).then(function() {
    // Add a personal bookmark if present.
    if (personal) {
      bookmarkService.isBookmarked(personal).then(function(isPersonal) {
        if (!isPersonal) {
          bookmarkService.bookmark(personal, true);
        }
      });
    }
  }).catch(bookmarkFail);
}

function getEmailFromAccountName(accountName) {
  // Use a regular expression to extract the email.
  return /dev.v.io\/u\/(.*?)\//.exec(accountName)[1];
}

// Set the returning_user flag to true.
function completeOnboarding() {
  store.setValue('returning_user', true).catch(function(err) {
    log.error('Failed to set "returning_user" flag', err);
  });
}
