// generatePage.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.yellow(`${message}`))
const successLog = message => console.log(chalk.green(`${message}`))
const errorLog = error => console.log(chalk.red(`${error}`))
const {
  indexPage,
  addEditPage,
  servicePage
  // modelPage
} = 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('请输入要生成的页面名称:')
let componentName = ''
process.stdin.on('data', async chunk => {
  const inputName = String(chunk)
    .trim()
    .toString()
  // 页面组件目录路径
  const componentDirectory = resolve('../src/views', inputName)
  // apis-service 目录路径
  const apisServiceDirectory = resolve('../src/apis/service', inputName)
  // // apis-model 目录路径
  // const apisModelDirectory = resolve("../src/apis/model", inputName);
  // vue组件路径--首页--列表页
  const listTablePath = resolve(componentDirectory, 'index.vue')
  // vue组件路径--添加修改详情
  const addEditPath = resolve(componentDirectory, 'addEdit.vue')
  // service文件路径
  const servicePath = resolve(apisServiceDirectory, 'index.js')
  // // model文件路径
  // const moldePath = resolve(apisModelDirectory, "index.js");
  // views页面文件目录
  const hasComponentDirectory = fs.existsSync(componentDirectory)
  if (hasComponentDirectory) {
    errorLog(`${inputName}组件目录已存在,请重新输入`)
    return
  } else {
    log(`正在生成 component 目录 ${componentDirectory}`)
    await dotExistDirectoryCreate(componentDirectory)
  }
  // service文件目录
  const hasService = fs.existsSync(apisServiceDirectory)
  if (hasService) {
    errorLog(`${inputName}service目录已存在,请重新输入`)
    return
  } else {
    log(`正在生成 apis/service 目录 ${apisServiceDirectory}`)
    await dotExistDirectoryCreate(apisServiceDirectory)
  }
  // model 文件目录
  // const hasModel = fs.existsSync(apisModelDirectory);
  // if (hasModel) {
  //   errorLog(`${inputName}组件目录已存在,请重新输入`);
  //   return;
  // } else {
  //   log(`正在生成 apis/model 目录 ${apisModelDirectory}`);
  //   await dotExistDirectoryCreate(apisModelDirectory);
  // }
  try {
    if (inputName.includes('/')) {
      const inputArr = inputName.split('/')
      componentName = inputArr[inputArr.length - 1]
    } else {
      componentName = inputName
    }
    log(`正在生成 views-列表 文件 ${listTablePath}`)
    await generateFile(listTablePath, indexPage(inputName, componentName))
    log(`正在生成 views-添加修改详情 文件 ${addEditPath}`)
    await generateFile(addEditPath, addEditPage(inputName, componentName))
    log(`正在生成 apis-service 文件 ${servicePath}`)
    await generateFile(servicePath, servicePage)
    // log(`正在生成 apis-model 文件 ${moldePath}`);
    // await generateFile(moldePath, modelPage(componentName));
    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()
    })
  }
}