"use strict";

const inquirer = require("inquirer");
const validateNpmName = require("validate-npm-package-name");
const languages = require("@freesewing/i18n").languages;
const strings = require("@freesewing/i18n").strings;
const config = require("./config");

let languageChoices = [];
for (let l of Object.keys(languages)) {
  languageChoices.push({
    name: languages[l],
    value: l,
    short: languages[l]
  });
}

module.exports = async opts => {
  if (opts.name && !validateNpmName(opts.name).validForNewPackages) {
    throw new Error(`invalid package name "${opts.name}"`);
  }

  if (opts.skipPrompts) {
    if (!opts.name) {
      throw new Error(
        "invalid input; you must pass a package name with --skip-prompts"
      );
    }

    Object.keys(opts).forEach(key => {
      const value = opts[key];
      if (typeof value === "function") {
        opts[key] = value(opts);
      }
    });

    return opts;
  } else {
    const info = await inquirer.prompt([
      {
        type: "list",
        name: "language",
        message: "Language",
        choices: languageChoices,
        default: "en"
      },
      {
        type: "input",
        name: "name",
        message: info => strings[info.language]["cfp.patternName"],
        validate: name => {
          return name && validateNpmName(name).validForNewPackages;
        },
        default: opts.name
      },
      {
        type: "input",
        name: "description",
        message: info => strings[info.language]["cfp.patternDescription"],
        default: opts.description
      },
      {
        type: "list",
        name: "type",
        message: info => strings[info.language]["cfp.patternType"],
        choices: info => [
          {
            name: strings[info.language]["filter.type.pattern"],
            value: "pattern"
          },
          { name: strings[info.language]["filter.type.block"], value: "block" }
        ],
        default: "pattern"
      },
      {
        type: "list",
        name: "department",
        message: info => strings[info.language]["filter.department.title"],
        choices: info => [
          {
            name: strings[info.language]["filter.department.menswear"],
            value: "menswear"
          },
          {
            name: strings[info.language]["filter.department.womenswear"],
            value: "womenswear"
          },
          {
            name: strings[info.language]["filter.department.accessories"],
            value: "accessories"
          }
        ],
        default: "womenswear"
      },
      {
        type: "input",
        name: "author",
        message: info => strings[info.language]["cfp.author"],
        default: opts.author
      },
      {
        type: "input",
        name: "repo",
        message: info => strings[info.language]["cfp.githubRepo"],
        default: opts.repo
      },
      {
        type: "list",
        name: "manager",
        message: info => strings[info.language]["cfp.packageManager"],
        choices: ["npm", "yarn"],
        default: opts.manager
      }
    ]);

    config.set("author", info.author);
    config.set("manager", info.manager);
    config.set("template", "default");
    config.set("license", "MIT");
    info.template = "default";

    return {
      ...info,
      git: opts.git,
      version: opts.version
    };
  }
};