const fs = require('fs');
const crypto = require('crypto');
const execSync = require('child_process').execSync;

const testManifest = 'test/test_manifest.json';
const pdfFolder = 'test/pdfs/';
const gitIgnore = 'test/pdfs/.gitignore';

if (process.argv.length < 3) {
  console.log('\nUsage: node add_test.js FILE\n');
  console.log('  Add a PDF as a reference test. FILE must be located in ' +
              `${pdfFolder}`);
  process.exit(1);
}

let file = process.argv[2];
if (!file.startsWith(pdfFolder)) {
  throw new Error(`PDF file must be in '${pdfFolder}' directory.`);
}
if (!fs.existsSync(file)) {
  throw new Error(`PDF file does not exist '${file}'.`);
}

function calculateMD5(file, callback) {
  var hash = crypto.createHash('md5');
  var stream = fs.createReadStream(file);
  stream.on('data', function (data) {
    hash.update(data);
  });
  stream.on('error', function (err) {
    callback(err);
  });
  stream.on('end', function() {
    var result = hash.digest('hex');
    callback(null, result);
  });
}

function getRandomArbitrary(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
}

calculateMD5(file, (err, md5) => {
  if (err) {
    throw new Error(err);
  }
  let contents = fs.readFileSync(gitIgnore, 'utf8').split('\n');
  let randomLine = getRandomArbitrary(10, contents.length - 2);
  contents.splice(randomLine, 0,
                  '!' + file.substring(file.lastIndexOf('/') + 1));
  fs.writeFileSync('test/pdfs/.gitignore', contents.join('\n'));

  contents = fs.readFileSync(testManifest, 'utf8');
  let pdf = file.substring(file.lastIndexOf('/') + 1, file.length - 4);
  let randomPoint = getRandomArbitrary(100, contents.length - 20);
  let bracket = contents.indexOf('},\n', randomPoint);
  let out = contents.substring(0, bracket) +
    '},\n' +
    `    {  "id": "${pdf}",\n` +
    `       "file": "pdfs/${pdf}.pdf",\n` +
    `       "md5": "${md5}",\n` +
    '       "rounds": 1,\n' +
    '       "type": "eq"\n' +
    '    ' +
    contents.substring(bracket);
  fs.writeFileSync('test/test_manifest.json', out);
  execSync(`git add ${testManifest} ${gitIgnore}`);
  execSync(`git add ${file}`);
});