const fs = require('fs');
const { execSync } = require('child_process');
const { checkMochaSyntax } = require('./check-mocha-syntax');

const AUTOMATION_TYPE = Object.freeze({
  CI: 'ci',
  PRE_COMMIT_HOOK: 'pre-commit-hook',
  PRE_PUSH_HOOK: 'pre-push-hook',
});

const automationType = process.argv[2];

if (automationType === AUTOMATION_TYPE.CI) {
  const optionalArguments = process.argv.slice(3);
  if (optionalArguments.length !== 1) {
    console.error('Invalid number of arguments.');
    process.exit(1);
  }

  const diff = fs.readFileSync(optionalArguments[0], {
    encoding: 'utf8',
    flag: 'r',
  });

  checkMochaSyntax(diff);
} else if (automationType === AUTOMATION_TYPE.PRE_COMMIT_HOOK) {
  const diff = getPreCommitHookDiff();

  checkMochaSyntax(diff);
} else if (automationType === AUTOMATION_TYPE.PRE_PUSH_HOOK) {
  const diff = getPrePushHookDiff();

  checkMochaSyntax(diff);
} else {
  console.error('Invalid automation type.');
  process.exit(1);
}

function getPreCommitHookDiff() {
  return execSync(`git diff --cached HEAD`).toString().trim();
}

function getPrePushHookDiff() {
  const currentBranch = execSync(`git rev-parse --abbrev-ref HEAD`)
    .toString()
    .trim();

  return execSync(
    `git diff ${currentBranch} origin/${currentBranch} -- . ':(exclude)development/fitness-functions/'`,
  )
    .toString()
    .trim();
}