const { join, dirname } = require("path")
const { readFileSync, existsSync, mkdirSync, createWriteStream } = require('fs')
const { spawn } = require('child_process')

async function execProcess(cmd, logFile, args, useConsole) {
  let compileRoot = dirname(dirname(process.argv[1]))
  console.log("Svelte check...\n", process.cwd(), args)

  if (!existsSync(join(process.cwd(), '.svelte-check'))) {
    mkdirSync(join(process.cwd(), '.svelte-check'))
  }

  const compileOut = spawn(cmd, args)

  const stdoutFilePath = `.svelte-check/${logFile}.log`
  const stderrFilePath = `.svelte-check/${logFile}-err.log`


  const outPromise = new Promise((resolve) => {
    if (compileOut.stdout != null) {
      let outPipe = createWriteStream(stdoutFilePath)
      compileOut.stdout.pipe(outPipe)
      compileOut.stdout.on('end', function (data) {
        outPipe.close()
        if( useConsole ) {
          console.log(readFileSync(stdoutFilePath).toString())
          console.log(readFileSync(stderrFilePath).toString())
        }
        resolve()
      })
    } else {
      resolve()
    }
  })

  const errPromise = new Promise((resolve) => {
    if (compileOut.stderr != null) {
      let outPipe = createWriteStream(stderrFilePath)
      compileOut.stderr.pipe(outPipe)
      compileOut.stderr.on('end', function (data) {
        outPipe.close()
        resolve()
      })
    } else {
      resolve()
    }
  })

  let editCode = 0
  const closePromise = new Promise(resolve => {
    compileOut.on('close', (code) => {
      editCode = code
      resolve()
    })
    compileOut.on('error', (err) => {
      console.error(err)
      resolve()
    })
  })

  await Promise.all([outPromise, errPromise, closePromise])

  if (editCode !== 0) {
    const data = readFileSync(stdoutFilePath)
    const errData = readFileSync(stderrFilePath)
    console.error('\n' + data.toString() + '\n' + errData.toString())
    process.exit(editCode)
  }
}

let args = [] // process.argv.slice(2)
let useConsole = false
for(const a of process.argv.slice(2)) {
  if( a === '--console') {
    useConsole = true
  } else {
    args.push(a)
  }
}
let st = Date.now()
execProcess(
  'svelte-check',
  'svelte-check', [
  '--output', 'human',
  ...args  
], useConsole)
  .then(() => {
    console.log("Svelte check time: ", Date.now() - st)
  })