var $ = require('./util/jquery');

var message = require('./components/message');
var vanadiumWrapperDefault = require('./vanadium-wrapper');

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

var Maps = require('./components/maps');
var TravelSync = require('./travelsync');
var Identity = require('./identity');

var Travel = defineClass({
  publics: {
    error: function (err) {
      this.maps.message(message.error(err.toString()));
    },

    info: function (info) {
      this.maps.message(message.info(info));
    }
  },

  init: function (opts) {
    opts = opts || {};
    var vanadiumWrapper = opts.vanadiumWrapper || vanadiumWrapperDefault;
    var travel = this;

    this.sync = new TravelSync();

    var reportError = $.proxy(this, 'error');

    vanadiumWrapper.init(opts.vanadium).then(
      function(wrapper) {
        wrapper.onCrash.add(reportError);

        var identity = new Identity(wrapper.getAccountName());
        identity.mountName = makeMountName(identity);
        travel.sync.start(identity.mountName, wrapper).catch(reportError);
      }, reportError);

    this.maps = new Maps(opts.maps);
    var $domRoot = opts.domRoot? $(opts.domRoot) : $('body');
    $domRoot.append(travel.maps.$);
  }
});

function makeMountName(id) {
  // TODO: first-class app-wide rather than siloed by account
  return 'users/' + id.username + '/travel/' + id.deviceName;
}

module.exports = Travel;
