#!/usr/bin/env node

'use strict';

/*eslint-disable no-console*/

// stdlib var fs = require('fs');

// 3rd-party var argparse = require('argparse');

// internal var yaml = require('..');

////////////////////////////////////////////////////////////////////////////////

var cli = new argparse.ArgumentParser({

prog:     'js-yaml',
version:  require('../package.json').version,
addHelp:  true

});

cli.addArgument([ '-c', '–compact' ], {

help:   'Display errors in compact mode',
action: 'storeTrue'

});

// deprecated (not needed after we removed output colors) // option suppressed, but not completely removed for compatibility cli.addArgument([ '-j', '–to-json' ], {

help:   argparse.Const.SUPPRESS,
dest:   'json',
action: 'storeTrue'

});

cli.addArgument([ '-t', '–trace' ], {

help:   'Show stack trace on error',
action: 'storeTrue'

});

cli.addArgument([ 'file' ], {

help:   'File to read, utf-8 encoded without BOM',
nargs:  '?',
defaultValue: '-'

});

////////////////////////////////////////////////////////////////////////////////

var options = cli.parseArgs();

////////////////////////////////////////////////////////////////////////////////

function readFile(filename, encoding, callback) {

if (options.file === '-') {
  // read from stdin

  var chunks = [];

  process.stdin.on('data', function (chunk) {
    chunks.push(chunk);
  });

  process.stdin.on('end', function () {
    return callback(null, Buffer.concat(chunks).toString(encoding));
  });
} else {
  fs.readFile(filename, encoding, callback);
}

}

readFile(options.file, 'utf8', function (error, input) {

var output, isYaml;

if (error) {
  if (error.code === 'ENOENT') {
    console.error('File not found: ' + options.file);
    process.exit(2);
  }

  console.error(
    options.trace && error.stack ||
    error.message ||
    String(error));

  process.exit(1);
}

try {
  output = JSON.parse(input);
  isYaml = false;
} catch (err) {
  if (err instanceof SyntaxError) {
    try {
      output = [];
      yaml.loadAll(input, function (doc) { output.push(doc); }, {});
      isYaml = true;

      if (output.length === 0) output = null;
      else if (output.length === 1) output = output[0];

    } catch (e) {
      if (options.trace && err.stack) console.error(e.stack);
      else console.error(e.toString(options.compact));

      process.exit(1);
    }
  } else {
    console.error(
      options.trace && err.stack ||
      err.message ||
      String(err));

    process.exit(1);
  }
}

if (isYaml) console.log(JSON.stringify(output, null, '  '));
else console.log(yaml.dump(output));

});