"use strict";

var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
_Object$defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _path = _interopRequireDefault(require("path"));
var _inquirer = _interopRequireDefault(require("inquirer"));
var _index = require("./index.js");
var _fileWrapper = require("./lib/fileWrapper.js");
// import getLatestVersion from 'latest-version'

const CWD = process.cwd();

/**
 * 生成小游戏工程
 * @param {String} projectName 工程名
 * @param {Object} options
 * @param {String} options.cwd       要创建小游戏工程的路径
 * @param {String} options.template  创建小游戏工程使用的模板
 * @param {String} options.force     是否强制覆盖，如果指定目录已经存在
 */
async function create(projectName, {
  cwd = CWD,
  template,
  force = false
}) {
  // 是否是在当前目录创建小游戏工程，也就是projectName指定为.
  const inCurrent = projectName === '.';
  // 如果是在当前目录创建小游戏工程，name 取当前目录的目录名
  const name = inCurrent ? _path.default.relative(_path.default.join(cwd, '../'), cwd) : projectName;
  const targetDir = _path.default.resolve(cwd, projectName || '.');
  if (_index.fs.existsSync(targetDir)) {
    if (inCurrent) {
      const {
        ok
      } = await _inquirer.default.prompt([{
        name: 'ok',
        type: 'confirm',
        message: cwd === CWD ? 'Generate project in current directory?' : `Generate project in ${cwd}?`
      }]);
      if (!ok) {
        return;
      }
    } else {
      if (force) {
        (0, _index.log)(`\nRemoving ${_index.chalk.cyan(targetDir)}...`);
        await _index.fs.remove(targetDir);
      } else {
        const {
          action
        } = await _inquirer.default.prompt([{
          name: 'action',
          type: 'list',
          message: `Target directory ${_index.chalk.cyan(targetDir)} already exists. Pick an action:`,
          choices: [{
            name: 'Overwrite',
            value: 'overwrite'
          }, {
            name: 'Merge',
            value: 'merge'
          }, {
            name: 'Cancel',
            value: false
          }]
        }]);
        if (!action) {
          return;
        } else if (action === 'overwrite') {
          (0, _index.log)(`\nRemoving ${_index.chalk.cyan(targetDir)}...`);
          await _index.fs.remove(targetDir);
        }
      }
    }
  }
  await createImpl(name, targetDir, template);
}
async function createImpl(name, context, template) {
  (0, _index.logWithSpinner)(`✨`, `Creating project in ${_index.chalk.yellow(context)}.`);
  let templatePath = _path.default.join(__dirname, '../../', 'templates', template);
  if (!_index.fs.existsSync(templatePath)) {
    templatePath = _path.default.join(__dirname, '../../', 'templates', 'default');
  }
  (0, _index.stopSpinner)();
  (0, _index.logWithSpinner)(`📄`, 'Copy Files from templates...');
  await _index.fs.copy(templatePath, context, {
    clobber: false
  });
  (0, _fileWrapper.replaceFiles)({
    appName: name
  }, ['src/manifest.json', 'package.json'].map(f => {
    return _path.default.join(context, f);
  }));
  (0, _index.stopSpinner)();
  (0, _index.log)(`📄  Successfully Copy Files from ${_index.chalk.yellow(templatePath)}.`);

  // log instructions
  (0, _index.log)();
  (0, _index.log)(`🎉  Successfully created project ${_index.chalk.yellow(name)}.`);
  let cdTip;
  if (context === CWD) {
    // 如果小游戏工程的目录与当前执行目录一致，不显示cdTip
    cdTip = '';
  } else {
    if (_path.default.relative(CWD, context) === name) {
      cdTip = _index.chalk.cyan(` ${_index.chalk.gray('$')} cd ${name}\n ${_index.chalk.gray('$')} qg build\n ${_index.chalk.gray('$')} qg server\n`);
    } else {
      cdTip = _index.chalk.cyan(` ${_index.chalk.gray('$')} cd ${context}\n ${_index.chalk.gray('$')} qg build\n ${_index.chalk.gray('$')} qg server\n`);
    }
  }
  (0, _index.log)(`👉  Get started with the following commands:\n\n` + cdTip);
}

/**
* 生成工程目录
* @param name 项目名
*/
var _default = (...args) => {
  return create(...args).catch(err => {
    (0, _index.error)('Creat MiniGame Failed!');
    throw err;
  });
};
exports.default = _default;