import * as childProcess from 'child_process'
import * as Events from 'events'
import AnsiUp from 'ansi_up'

const asniUp = new AnsiUp()
/**
 * 解码ascii字符结果为GB18030
 * @param {Buffer} str 输入字符
 */
function encode(t: Buffer) {
  return asniUp.ansi_to_html(t.toString('utf-8'))
}

/**
 * 执行CMD指令，返回对应输出
 * @param command 执行的指令
 * @param args 执行的参数，无参数可以不传入，或者传入空数据
 * @param targetDir 执行的路径
 */
export default function executeCommand(
  command: string,
  args: Array<string> = [],
  targetDir: string | undefined
) {
  const cmdEvent = new Events()

  const ls = childProcess.spawn(command, args, {
    cwd: targetDir,
    // stdin: ignore会自动让需要input的程序出错
    stdio: ['ignore', 'pipe', 'pipe'],
    shell: true
  })

  ls.stderr.on('data', (data) => {
    cmdEvent.emit('data', encode(data))
  })

  ls.stdout.on('data', (data) => {
    cmdEvent.emit('data', encode(data))
  })

  ls.on('exit', (code) => {
    if (code === 0) {
      cmdEvent.emit('done')
    } else {
      cmdEvent.emit('error', new Error(`exit code ${code}`))
    }
  })

  ls.on('error', (error) => {
    cmdEvent.emit('error', error)
  })

  return cmdEvent
}