#!/usr/bin/env node

const fs = require('fs') const path = require('path') const minimist = require('minimist') const pkg = require('../package.json') const JSON5 = require('./')

const argv = minimist(process.argv.slice(2), {

alias: {
    'convert': 'c',
    'space': 's',
    'validate': 'v',
    'out-file': 'o',
    'version': 'V',
    'help': 'h',
},
boolean: [
    'convert',
    'validate',
    'version',
    'help',
],
string: [
    'space',
    'out-file',
],

})

if (argv.version) {

version()

} else if (argv.help) {

usage()

} else {

const inFilename = argv._[0]

let readStream
if (inFilename) {
    readStream = fs.createReadStream(inFilename)
} else {
    readStream = process.stdin
}

let json5 = ''
readStream.on('data', data => {
    json5 += data
})

readStream.on('end', () => {
    let space
    if (argv.space === 't' || argv.space === 'tab') {
        space = '\t'
    } else {
        space = Number(argv.space)
    }

    let value
    try {
        value = JSON5.parse(json5)
        if (!argv.validate) {
            const json = JSON.stringify(value, null, space)

            let writeStream

            // --convert is for backward compatibility with v0.5.1. If
            // specified with <file> and not --out-file, then a file with
            // the same name but with a .json extension will be written.
            if (argv.convert && inFilename && !argv.o) {
                const parsedFilename = path.parse(inFilename)
                const outFilename = path.format(
                    Object.assign(
                        parsedFilename,
                        {base: path.basename(parsedFilename.base, parsedFilename.ext) + '.json'}
                    )
                )

                writeStream = fs.createWriteStream(outFilename)
            } else if (argv.o) {
                writeStream = fs.createWriteStream(argv.o)
            } else {
                writeStream = process.stdout
            }

            writeStream.write(json)
        }
    } catch (err) {
        console.error(err.message)
        process.exit(1)
    }
})

}

function version () {

console.log(pkg.version)

}

function usage () {

  console.log(
      `
Usage: json5 [options] <file>

If <file> is not provided, then STDIN is used.

Options:

  -s, --space              The number of spaces to indent or 't' for tabs
  -o, --out-file [file]    Output to the specified file, otherwise STDOUT
  -v, --validate           Validate JSON5 but do not output JSON
  -V, --version            Output the version number
  -h, --help               Output usage information`
  )

}