#!/usr/bin/env node
"use strict";var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));var _commander = _interopRequireDefault(require("commander"));
var _didyoumean = _interopRequireDefault(require("didyoumean"));
var _index = require("./cli-shared-utils/index.js");
var _index2 = require("./cli-packager/index.js");
var _index3 = require("./cli-server/index.js");
var _index4 = require("./cli-weixin/index.js");
var _enhanceErrorMessages = _interopRequireDefault(require("./cli-shared-utils/lib/enhanceErrorMessages.js"));
var _create = _interopRequireDefault(require("./cli-shared-utils/create.js"));

_didyoumean.default.threshold = 0.6;

const pkg = require('../package.json');

function suggestCommands(cmd) {
  const availableCommands = _commander.default.commands.map((cmd) => {
    return cmd._name;
  });

  const suggestion = (0, _didyoumean.default)(cmd, availableCommands);
  if (suggestion) {
    (0, _index.log)(`  ` + _index.chalk.red(`Did you mean ${_index.chalk.yellow(suggestion)}?`));
  }
}

async function main() {
  _commander.default.
  version(pkg.version, '-v, --version').
  usage('<command> [options]');

  _commander.default.
  command('init <app-name>').
  description('init a new project').
  option('-t, --template <template>', 'Choose a template for this project', 'default').
  option('-c, --cwd <dir>', 'input the target dir for initing').
  option('-f, --force', 'force overwrite the minigame project if existed').
  action((name, cmd) => {
    const options = cleanArgs(cmd);
    (0, _create.default)(name, options);
  });

  // output help information on unknown commands
  _commander.default.
  arguments('<command>').
  action((cmd) => {
    const args = (0, _index.minimist)(process.argv.slice(2), {
      string: ['buildType']
    });

    const cleanedArgs = {};
    for (const key in args) {
      const cleanedKey = key.replace(/--/g, '');
      cleanedArgs[cleanedKey] = args[key];
    }

    (0, _index.info)(`当前版本为:${pkg.version}`);

    if (cmd === 'build') {
      // debug打包命令
      (0, _index.info)('qg build', (0, _stringify.default)(cleanedArgs));
      (0, _index2.build)(cleanedArgs);
    } else if (cmd === 'release') {
      // release打包命令
      (0, _index.info)('qg release', (0, _stringify.default)(cleanedArgs));
      (0, _index2.release)(cleanedArgs);
    } else if (cmd === 'transfer') {
      // 微小转换命令
      (0, _index.info)('qg transfer', (0, _stringify.default)(cleanedArgs));
      (0, _index4.transfer)(cleanedArgs);
    } else if (cmd === 'server') {
      // 调试服务启动命令
      (0, _index.info)('qg server', (0, _stringify.default)(cleanedArgs));
      (0, _index3.initServer)(cleanedArgs);
    } else {
      _commander.default.outputHelp();
      (0, _index.log)(`  ` + _index.chalk.red(`Unknown command ${_index.chalk.yellow(cmd)}.`));
      (0, _index.log)();
      suggestCommands(cmd);
    }
  });

  // add some useful info on help
  _commander.default.on('--help', () => {
    (0, _index.log)();
    (0, _index.log)(`  Run ${_index.chalk.cyan(`qg <command> --help`)} for detailed usage of given command.`);
    (0, _index.log)();
  });

  _commander.default.commands.forEach((c) => c.on('--help', () => (0, _index.log)()));

  // enhance common error messages
  (0, _enhanceErrorMessages.default)('missingArgument', (argName) => {
    return `Missing required argument ${_index.chalk.yellow(`<${argName}>`)}.`;
  });

  (0, _enhanceErrorMessages.default)('unknownOption', (optionName) => {
    return `Unknown option ${_index.chalk.yellow(optionName)}.`;
  });

  (0, _enhanceErrorMessages.default)('optionMissingArgument', (option, flag) => {
    return `Missing required argument for option ${_index.chalk.yellow(option.flags)}` + (
    flag ? `, got ${_index.chalk.yellow(flag)}` : ``);

  });

  _commander.default.parse(process.argv);

  // 如果没有输入命令，输出提示信息
  if (!process.argv.slice(2).length) {
    _commander.default.outputHelp();
  }
};

function camelize(str) {
  return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : '');
}

// commander passes the Command object itself as options,
// extract only actual options into a fresh object.
function cleanArgs(cmd) {
  const args = {};
  cmd.options.forEach((o) => {
    const key = camelize(o.long.replace(/^--/, ''));
    // if an option is not present and Command has a method with the same name
    // it should not be copied
    if (typeof cmd[key] !== 'function' && typeof cmd[key] !== 'undefined') {
      args[key] = cmd[key];
    }
  });
  return args;
}

// 开始服务
try {
  main();
} catch (err) {
}