const { spawn } = require('child_process');
const path = require('path');
const fs = require('fs');
const mkdirp = require('mkdirp');
const nightwatchSettings = require('./nightwatch.conf');

const commandAsWebserver = (command) => {
  if (process.env.DRUPAL_TEST_WEBSERVER_USER) {
    return `sudo -u ${process.env.DRUPAL_TEST_WEBSERVER_USER} ${command}`;
  }
  return command;
};

module.exports = {
  afterEach: (browser, done) => {
    // Writes the console log - used by the "logAndEnd" command.
    if (
      browser.drupalLogConsole &&
      (!browser.drupalLogConsoleOnlyOnError ||
        browser.currentTest.results.errors > 0 ||
        browser.currentTest.results.failed > 0)
    ) {
      const resultPath = path.join(
        __dirname,
        `../../../${nightwatchSettings.output_folder}/consoleLogs/${browser.currentTest.module}`,
      );
      const status =
        browser.currentTest.results.errors > 0 ||
        browser.currentTest.results.failed > 0
          ? 'FAILED'
          : 'PASSED';
      mkdirp.sync(resultPath);
      const now = new Date().toString().replace(/[\s]+/g, '-');
      const testName = (
        browser.currentTest.name || browser.currentTest.module
      ).replace(/[\s/]+/g, '-');
      browser
        .getLog('browser', (logEntries) => {
          const browserLog = JSON.stringify(logEntries, null, '  ');
          fs.writeFileSync(
            `${resultPath}/${testName}_${status}_${now}_console.json`,
            browserLog,
          );
        })
        .end(done);
    } else {
      browser.end(done);
    }
  },
  commandAsWebserver,
};
