'use strict';
const shell = require('shelljs');
const githubUsername = require('github-username');

const nameCache = new Map();
const emailCache = new Map();

/**
 * @mixin
 * @alias actions/user
 */
const user = module.exports;

user.git = {};
user.github = {};

/**
 * Retrieves user's name from Git in the global scope or the project scope
 * (it'll take what Git will use in the current context)
 * @return {String} configured git name or undefined
 */
user.git.name = () => {
  let name = nameCache.get(process.cwd());

  if (name) {
    return name;
  }

  if (shell.which('git')) {
    name = shell
      .exec('git config --get user.name', {silent: true})
      .stdout.trim();
    nameCache.set(process.cwd(), name);
  }

  return name;
};

/**
 * Retrieves user's email from Git in the global scope or the project scope
 * (it'll take what Git will use in the current context)
 * @return {String} configured git email or undefined
 */
user.git.email = () => {
  let email = emailCache.get(process.cwd());

  if (email) {
    return email;
  }

  if (shell.which('git')) {
    email = shell
      .exec('git config --get user.email', {silent: true})
      .stdout.trim();
    emailCache.set(process.cwd(), email);
  }

  return email;
};

/**
 * Retrieves GitHub's username from the GitHub API
 * @return {Promise} Resolved with the GitHub username or rejected if unable to
 *                   get the information
 */
user.github.username = () => githubUsername(user.git.email());