#!/usr/bin/env node
import { promisify } from 'util'
import fs from 'fs'
import art from 'art-template'
import axios from 'axios'
import path from 'path'
import chalk from 'chalk'
import { fieldType, GenParams } from '../utils/gen'
const readFile = promisify(fs.readFile)
const writeFile = promisify(fs.writeFile)
const mkdir = promisify(fs.mkdir)
const access = promisify(fs.access)
const serialize = (arr = [], res: any = {}, i?:number) => {
  arr.forEach((item: any, idx: number) => {
    res = !item.name && !res.length ? [] : res
    if (item.data && Array.isArray(item.data) && item.data.length) {
      res[item.name || idx] = serialize(item.data, void 0, idx)
      return res
    }
    res[item.name] = item.example
    return res
  })
  return res
}
const mkdirHandler =  async (dir: string) => {
  let fileExist = true
  try {
    await access(dir)
  } catch (err) {
    fileExist = false
  }
  if (!fileExist) {
    console.log(dir)
    await mkdir(dir)
  }
}
const rules = fieldType
export default async function (code: string, proxy: string, downPath: string) {
  const indexTpl = await readFile(`${__dirname}/template/index.js`)
  const modelTpl = await readFile(`${__dirname}/template/model/index.js`)
  const requestTpl = await readFile(`${__dirname}/template/request.js`)
  const utilsTpl = await readFile(`${__dirname}/template/model/utils.js`)
  const data = await axios(proxy).then(res => res.data)
  {
    data.data.definition.forEach((item: any) => {
      item.outputParam = serialize(item.outputParam)
    })
  }
  const template = art.compile(indexTpl.toString())(Object.assign(data.data, {
    rules
  }))
  const modelTemplate = art.compile(modelTpl.toString())(Object.assign(data.data, {
    JSON,
    Array,
    gen: new GenParams
  }))
  const requestTemplate = art.compile(requestTpl.toString())(Object.assign(data.data, {
    rules
  }))
  await mkdirHandler(path.resolve(`${downPath}`, 'interface'))
  await mkdirHandler(path.resolve(`${downPath}`, 'interface/model'))
  writeFile(`${path.resolve(downPath, 'interface/request.js')}`, requestTemplate.replace(/\n\s+$/mg, ''))
  writeFile(`${path.resolve(downPath, 'interface/model/index.js')}`, modelTemplate.replace(/\n\s+$/mg, '').replace(/\&\#34;/g, '"').replace(/['"](Number|String|Boolean|Date|Object|Array)['"]/g, '$1'))
  writeFile(`${path.resolve(downPath, 'interface/index.js')}`, template.replace(/\n\s+$/mg, ''))
  writeFile(`${path.resolve(downPath, 'interface/model/utils.js')}`, utilsTpl)
  console.log(chalk.greenBright(`生成完成，请到${path.resolve(`${downPath}/interface`)}下查看`))
}
