// generateComponent.js 文件，放置生成组件的代码
const chalk = require("chalk");
const path = require("path");
const fs = require("fs");
const resolve = (...file) => path.resolve(__dirname, ...file);
// const log = message => console.log(chalk.green(`${message}`));
// const successLog = message => console.log(chalk.blue(`${message}`));
const log = message => console.log(chalk.yellow(`${message}`));
const successLog = message => console.log(chalk.green(`${message}`));
const errorLog = error => console.log(chalk.red(`${error}`));
const { vueTemplate, entryTemplate } = require("./template");

const generateFile = (path, data) => {
  if (fs.existsSync(path)) {
    errorLog(`${path}文件已存在`);
    return;
  }
  return new Promise((resolve, reject) => {
    fs.writeFile(path, data, "utf8", err => {
      if (err) {
        errorLog(err.message);
        reject(err);
      } else {
        resolve(true);
      }
    });
  });
};
log("请输入要生成的组件名称、如需生成全局组件，请加 global/ 前缀");
let componentName = "";
process.stdin.on("data", async chunk => {
  const inputName = String(chunk)
    .trim()
    .toString();
  // 组件目录路径
  const componentDirectory = resolve("../src/components", inputName);

  // vue组件路径
  const componentVueName = resolve(componentDirectory, "main.vue");
  // 入口文件路径
  const entryComponentName = resolve(componentDirectory, "index.js");

  const hasComponentDirectory = fs.existsSync(componentDirectory);
  if (hasComponentDirectory) {
    errorLog(`${inputName}组件目录已存在，请重新输入`);
    return;
  } else {
    log(`正在生成 component 目录 ${componentDirectory}`);
    await dotExistDirectoryCreate(componentDirectory);
    // fs.mkdirSync(componentDirectory);
  }
  try {
    if (inputName.includes("/")) {
      const inputArr = inputName.split("/");
      componentName = inputArr[inputArr.length - 1];
    } else {
      componentName = inputName;
    }
    log(`正在生成 vue 文件 ${componentVueName}`);
    await generateFile(componentVueName, vueTemplate(componentName));
    log(`正在生成 entry 文件 ${entryComponentName}`);
    await generateFile(entryComponentName, entryTemplate);
    successLog("生成成功");
  } catch (e) {
    errorLog(e.message);
  }

  process.stdin.emit("end");
});
process.stdin.on("end", () => {
  log("exit");
  process.exit();
});
function dotExistDirectoryCreate(directory) {
  return new Promise(resolve => {
    mkdirs(directory, function() {
      resolve(true);
    });
  });
}

// 递归创建目录
function mkdirs(directory, callback) {
  var exists = fs.existsSync(directory);
  if (exists) {
    callback();
  } else {
    mkdirs(path.dirname(directory), function() {
      fs.mkdirSync(directory);
      callback();
    });
  }
}
