#!/usr/bin/env node
'use strict';
/*eslint-disable no-console*/
const fs = require('fs');
const path = require('path');
const parser = require('./src/parser');
const readToEnd = require('./src/read').readToEnd;

if (process.argv[2] === '--help' || process.argv[2] === '-h') {
  console.log('Fast XML Parser ' + require(path.join(__dirname + '/package.json')).version);
  console.log('----------------');
  console.log('xml2js [-ns|-a|-c|-v|-V] <filename> [-o outputfile.json]');
  console.log('cat xmlfile.xml | xml2js [-ns|-a|-c|-v|-V] [-o outputfile.json]');
  console.log('-ns: remove namespace from tag and atrribute name.');
  console.log("-a: don't parse attributes.");
  console.log('-c: parse values to premitive type.');
  console.log('-v: validate before parsing.');
  console.log('-V: validate only.');
} else if (process.argv[2] === '--version') {
  console.log(require(path.join(__dirname + '/package.json')).version);
} else {
  const options = {
    ignoreNameSpace: true,
    ignoreAttributes: false,
    parseNodeValue: true,
    parseAttributeValue: true,
  };
  let fileName = '';
  let outputFileName;
  let validate = false;
  let validateOnly = false;
  for (let i = 2; i < process.argv.length; i++) {
    if (process.argv[i] === '-ns') {
      options.ignoreNameSpace = false;
    } else if (process.argv[i] === '-a') {
      options.ignoreAttributes = true;
    } else if (process.argv[i] === '-c') {
      options.parseNodeValue = false;
      options.parseAttributeValue = false;
    } else if (process.argv[i] === '-o') {
      outputFileName = process.argv[++i];
    } else if (process.argv[i] === '-v') {
      validate = true;
    } else if (process.argv[i] === '-V') {
      validateOnly = true;
    } else {
      //filename
      fileName = process.argv[i];
    }
  }
  const callback = function(xmlData) {
    let output = '';
    if (validate) {
      const result = parser.validate(xmlData);
      if (result === true) {
        output = JSON.stringify(parser.parse(xmlData, options), null, 4);
      } else {
        output = result;
      }
    } else if (validateOnly) {
      output = parser.validate(xmlData);
      process.exitCode = output === true ? 0 : 1;
    } else {
      output = JSON.stringify(parser.parse(xmlData, options), null, 4);
    }
    if (outputFileName) {
      writeToFile(outputFileName, output);
    } else {
      console.log(output);
    }
  };

  try {
    if (!fileName) {
      readToEnd(process.stdin, function(err, data) {
        if (err) {
          throw err;
        }
        callback(data.toString());
      });
    } else {
      fs.readFile(fileName, function(err, data) {
        if (err) {
          throw err;
        }
        callback(data.toString());
      });
    }
  } catch (e) {
    console.log('Seems an invalid file or stream.' + e);
  }
}

function writeToFile(fileName, data) {
  fs.writeFile(fileName, data, function(err) {
    if (err) {
      throw err;
    }
    console.log('JSON output has been written to ' + fileName);
  });
}
