"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.loginOrRegisterIfLoggedOut = loginOrRegisterIfLoggedOut;
exports.login = login;
exports.register = register;

function _chalk() {
  const data = _interopRequireDefault(require("chalk"));

  _chalk = function () {
    return data;
  };

  return data;
}

function _commander() {
  const data = _interopRequireDefault(require("commander"));

  _commander = function () {
    return data;
  };

  return data;
}

function _xdl() {
  const data = require("@expo/xdl");

  _xdl = function () {
    return data;
  };

  return data;
}

function _CommandError() {
  const data = _interopRequireDefault(require("./CommandError"));

  _CommandError = function () {
    return data;
  };

  return data;
}

function _prompt() {
  const data = _interopRequireDefault(require("./prompt"));

  _prompt = function () {
    return data;
  };

  return data;
}

function _log() {
  const data = _interopRequireDefault(require("./log"));

  _log = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

_xdl().UserManager.initialize();

async function loginOrRegisterIfLoggedOut() {
  let user = await _xdl().UserManager.getCurrentUserAsync();

  if (user) {
    return user;
  }

  _log().default.warn('An Expo user account is required to proceed.');

  if (_commander().default.nonInteractive) {
    throw new (_CommandError().default)('NOT_LOGGED_IN', `Not logged in. Use \`${_commander().default.name} login -u username -p password\` to log in.`);
  }

  const question = {
    type: 'list',
    name: 'action',
    message: 'How would you like to authenticate?',
    choices: [{
      name: 'Make a new Expo account',
      value: 'register'
    }, {
      name: 'Log in with an existing Expo account',
      value: 'existingUser'
    }, {
      name: 'Cancel',
      value: 'cancel'
    }]
  };
  const {
    action
  } = await (0, _prompt().default)(question);

  if (action === 'register') {
    return register();
  } else if (action === 'existingUser') {
    return login({});
  } else {
    throw new (_CommandError().default)('BAD_CHOICE', 'Not logged in.');
  }
}

async function login(options) {
  const user = await _xdl().UserManager.getCurrentUserAsync();
  const nonInteractive = options.parent && options.parent.nonInteractive;

  if (!nonInteractive) {
    if (user) {
      const question = {
        type: 'confirm',
        name: 'action',
        message: `You are already logged in as ${_chalk().default.green(user.username)}. Log in as new user?`
      };
      const {
        action
      } = await (0, _prompt().default)(question);

      if (!action) {
        // If user chooses to stay logged in, return
        return user;
      }
    }

    return _usernamePasswordAuth(options.username, options.password);
  } else if (options.username && options.password) {
    return _usernamePasswordAuth(options.username, options.password);
  } else if (options.username && process.env.EXPO_CLI_PASSWORD) {
    return _usernamePasswordAuth(options.username, process.env.EXPO_CLI_PASSWORD);
  } else {
    throw new (_CommandError().default)('NON_INTERACTIVE', "Username and password not provided in non-interactive mode. Set the EXPO_CLI_PASSWORD environment variable if you don't want to pass in passwords through the command line.");
  }
}

async function _usernamePasswordAuth(username, password) {
  const questions = [];

  if (!username) {
    questions.push({
      type: 'input',
      name: 'username',
      message: 'Username/Email Address:',

      validate(val) {
        if (val.trim() === '') {
          return false;
        }

        return true;
      }

    });
  }

  if (!password) {
    questions.push({
      type: 'password',
      name: 'password',
      message: 'Password:',

      validate(val) {
        if (val.trim() === '') {
          return false;
        }

        return true;
      }

    });
  }

  const answers = await (0, _prompt().default)(questions);
  const data = {
    username: username || answers.username,
    password: password || answers.password
  };
  let user = await _xdl().UserManager.loginAsync('user-pass', data);

  if (user) {
    console.log(`\nSuccess. You are now logged in as ${_chalk().default.green(user.username)}.`);
    return user;
  } else {
    throw new Error('Unexpected Error: No user returned from the API');
  }
}

async function register() {
  console.log(`
Thanks for signing up for Expo!
Just a few questions:
`);
  const questions = [{
    type: 'input',
    name: 'email',
    message: 'E-mail:',
    filter: val => val.trim(),

    validate(val) {
      if (val.trim() === '') {
        return false;
      }

      return true;
    }

  }, {
    type: 'input',
    name: 'username',
    message: 'Username:',
    filter: val => val.trim(),

    validate(val) {
      if (val.trim() === '') {
        return false;
      }

      return true;
    }

  }, {
    type: 'password',
    name: 'password',
    message: 'Password:',
    filter: val => val.trim(),

    validate(val) {
      if (val.trim() === '') {
        return 'Please create a password';
      }

      return true;
    }

  }, {
    type: 'password',
    name: 'passwordRepeat',
    message: 'Confirm Password:',

    validate(val, answers) {
      if (val.trim() === '') {
        return false;
      }

      if (!answers || !answers.password || val.trim() !== answers.password.trim()) {
        return `Passwords don't match!`;
      }

      return true;
    }

  }];
  const answers = await (0, _prompt().default)(questions);
  const registeredUser = await _xdl().UserManager.registerAsync(answers);
  console.log('\nThanks for signing up!');
  return registeredUser;
}
//# sourceMappingURL=__sourcemaps__/accounts.js.map