"use strict";

const getGitConfigPath = require("git-config-path");
const githubUsername = require("github-username");
const parseGitConfig = require("parse-git-config");
const which = require("which");

const config = require("./config");

module.exports = async () => {
  const defaults = {
    name: "",
    description: "",
    author: config.get("author"),
    repo: info => `${info.author}/${info.name}`,
    license: config.get("license", "MIT"),
    manager: config.get("manager", "npm"),
    template: config.get("template", "default")
  };

  try {
    if (!config.get("author")) {
      const gitConfigPath = getGitConfigPath("global");

      if (gitConfigPath) {
        const gitConfig = parseGitConfig.sync({ path: gitConfigPath });

        if (gitConfig.github && gitConfig.github.user) {
          defaults.author = gitConfig.github.user;
        } else if (gitConfig.user && gitConfig.user.email) {
          defaults.author = await githubUsername(gitConfig.user.email);
        }
      }

      if (defaults.author) {
        config.set("author", defaults.author);
      }
    }

    if (!config.get("manager")) {
      if (which.sync("yarn", { nothrow: true })) {
        defaults.manager = "yarn";
      }

      config.set("manager", defaults.manager);
    }

    if (!config.get("template")) {
      config.set("template", defaults.template);
    }
  } catch (err) {}

  return defaults;
};