(function() {
  var Promise, TOKEN_URL, _, form, open, resin, settings, url, validEmail, visuals;

  Promise = require('bluebird');

  open = Promise.promisify(require('open'));

  _ = require('lodash');

  url = require('url');

  resin = require('resin-sdk');

  settings = require('resin-settings-client');

  form = require('resin-cli-form');

  visuals = require('resin-cli-visuals');

  validEmail = require('valid-email');

  TOKEN_URL = url.resolve(settings.get('dashboardUrl'), '/preferences');

  exports.login = {
    signature: 'login [token]',
    description: 'login to resin.io',
    help: "Use this command to login to your resin.io account.\n\nTo login, you need your token, which is accesible from the preferences page:\n\n	" + TOKEN_URL + "\n\nExamples:\n\n	$ resin login\n	$ resin login \"eyJ0eXAiOiJKV1Qi...\"",
    action: function(params, options, done) {
      return Promise["try"](function() {
        if (params.token != null) {
          return params.token;
        }
        console.info("To login to the Resin CLI, you need your unique token, which is accesible from\nthe preferences page at " + TOKEN_URL + "\n\nAttempting to open a browser at that location...");
        return open(TOKEN_URL)["catch"](function() {
          return console.error("Unable to open a web browser in the current environment.\nPlease visit " + TOKEN_URL + " manually.");
        }).then(function() {
          return form.ask({
            message: 'What\'s your token? (visible in the preferences page)',
            type: 'input'
          });
        });
      }).then(resin.auth.loginWithToken).then(resin.auth.whoami).tap(function(username) {
        return console.info("Successfully logged in as: " + username);
      }).nodeify(done);
    }
  };

  exports.logout = {
    signature: 'logout',
    description: 'logout from resin.io',
    help: 'Use this command to logout from your resin.io account.o\n\nExamples:\n\n	$ resin logout',
    permission: 'user',
    action: function(params, options, done) {
      return resin.auth.logout().nodeify(done);
    }
  };

  exports.signup = {
    signature: 'signup',
    description: 'signup to resin.io',
    help: 'Use this command to signup for a resin.io account.\n\nIf signup is successful, you\'ll be logged in to your new user automatically.\n\nExamples:\n\n	$ resin signup\n	Email: me@mycompany.com\n	Username: johndoe\n	Password: ***********\n\n	$ resin whoami\n	johndoe',
    action: function(params, options, done) {
      return form.run([
        {
          message: 'Email:',
          name: 'email',
          type: 'input',
          validate: function(input) {
            if (!validEmail(input)) {
              return 'Email is not valid';
            }
            return true;
          }
        }, {
          message: 'Username:',
          name: 'username',
          type: 'input'
        }, {
          message: 'Password:',
          name: 'password',
          type: 'password',
          validate: function(input) {
            if (input.length < 8) {
              return 'Password should be 8 characters long';
            }
            return true;
          }
        }
      ]).then(resin.auth.register).then(resin.auth.loginWithToken).nodeify(done);
    }
  };

  exports.whoami = {
    signature: 'whoami',
    description: 'get current username and email address',
    help: 'Use this command to find out the current logged in username and email address.\n\nExamples:\n\n	$ resin whoami',
    permission: 'user',
    action: function(params, options, done) {
      return Promise.props({
        username: resin.auth.whoami(),
        email: resin.auth.getEmail()
      }).then(function(results) {
        return console.log(visuals.table.vertical(results, ['$account information$', 'username', 'email']));
      }).nodeify(done);
    }
  };

}).call(this);