// Karma configuration
// GENERATED BY Bazel
try
{
  const fs = require('fs');
  const path = require('path');
  const tmp = require('tmp');
  const child_process = require('child_process');

  // Helper function to find a particular namedFile
  // within the webTestMetadata webTestFiles
  function findNamedFile(webTestMetadata, key) {
    let result;
    webTestMetadata['webTestFiles'].forEach(entry => {
      const webTestNamedFiles = entry['namedFiles'];
      if (webTestNamedFiles && webTestNamedFiles[key]) {
        result = webTestNamedFiles[key];
      }
    });
    return result;
  }

  // Helper function to extract a browser archive
  // and return the path to extract executable
  function extractWebArchive(extractExe, archiveFile, executablePath) {
    try {
      // Paths are relative to the 'external' folder within runfiles
      extractExe = extractExe ? path.join('external', extractExe) : extractExe;
      archiveFile = path.join('external', archiveFile);
      const extractedExecutablePath = path.join(process.cwd(), executablePath);
      if (!extractExe) {
        throw new Error('No EXTRACT_EXE found');
      }
      child_process.execFileSync(
          extractExe, [archiveFile, '.'],
          {stdio: [process.stdin, process.stdout, process.stderr]});
      return extractedExecutablePath;
    } catch (e) {
      console.error(`Failed to extract ${archiveFile}`);
      throw e;
    }
  }

  const browsers = [];
  let customLaunchers = null;

  // WEB_TEST_METADATA is configured in rules_webtesting based on value
  // of the browsers attribute passed to ts_web_test_suite
  // We setup the karma configuration based on the values in this object
  if (process.env['WEB_TEST_METADATA']) {
    const webTestMetadata = require(process.env['WEB_TEST_METADATA']);
    if (webTestMetadata['environment'] === 'sauce') {
      // If a sauce labs browser is chosen for the test such as
      // "@io_bazel_rules_webtesting//browsers/sauce:chrome-win10"
      // than the 'environment' will equal 'sauce'.
      // We expect that a SAUCE_USERNAME and SAUCE_ACCESS_KEY is available
      // from the environment for this test to run
      if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) {
        console.error('Make sure the SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are set.');
        process.exit(1);
      }
      // 'capabilities' will specify the sauce labs configuration to use
      const capabilities = webTestMetadata['capabilities'];
      customLaunchers = {
          'sauce': {
          base: 'SauceLabs',
          browserName: capabilities['browserName'],
          platform: capabilities['platform'],
          version: capabilities['version'],
        }
      };
      browsers.push('sauce');
    } else if (webTestMetadata['environment'] === 'local') {
      // When a local chrome or firefox browser is chosen such as
      // "@io_bazel_rules_webtesting//browsers:chromium-local" or
      // "@io_bazel_rules_webtesting//browsers:firefox-local"
      // then the 'environment' will equal 'local' and
      // 'webTestFiles' will contain the path to the binary to use
      const extractExe = findNamedFile(webTestMetadata, 'EXTRACT_EXE');
      webTestMetadata['webTestFiles'].forEach(webTestFiles => {
        const webTestNamedFiles = webTestFiles['namedFiles'];
        const archiveFile = webTestFiles['archiveFile'];
        if (webTestNamedFiles['CHROMIUM']) {
          // When karma is configured to use Chrome it will look for a CHROME_BIN
          // environment variable.
          if (archiveFile) {
            process.env.CHROME_BIN = extractWebArchive(extractExe, archiveFile, webTestNamedFiles['CHROMIUM']);
          } else {
            process.env.CHROME_BIN = require.resolve(webTestNamedFiles['CHROMIUM']);
          }
          browsers.push(process.env['DISPLAY'] ? 'Chrome' : 'ChromeHeadless');
        }
        if (webTestNamedFiles['FIREFOX']) {
          // When karma is configured to use Firefox it will look for a
          // FIREFOX_BIN environment variable.
          if (archiveFile) {
            process.env.FIREFOX_BIN = extractWebArchive(extractExe, archiveFile, webTestNamedFiles['FIREFOX']);
          } else {
            process.env.FIREFOX_BIN = require.resolve(webTestNamedFiles['FIREFOX']);
          }
          browsers.push(process.env['DISPLAY'] ? 'Firefox' : 'FirefoxHeadless');
        }
      });
    } else {
      console.warn(`Unknown WEB_TEST_METADATA environment '${webTestMetadata['environment']}'`);
    }
  }

  // Fallback to using the system local chrome if no valid browsers have been
  // configured above
  if (!browsers.length) {
    console.warn('No browsers configured. Configuring Karma to use system Chrome.');
    browsers.push(process.env['DISPLAY'] ? 'Chrome': 'ChromeHeadless');
  }

  const proxies = {};
  const files = [
    TMPL_bootstrap_files
    TMPL_user_files
  ].map(f => {
    if (f.startsWith('NODE_MODULES/')) {
      try {
        // attempt to resolve in @bazel/karma nested node_modules first
        return require.resolve(f.replace(/^NODE_MODULES\//, '@bazel/karma/node_modules/'));
      } catch (e) {
        // if that failed then attempt to resolve in root node_modules
        return require.resolve(f.replace(/^NODE_MODULES\//, ''));
      }
    } else {
      return require.resolve(f);
    }
  });

  // static files are added to the files array but
  // configured to not be included so karma-concat-js does
  // not included them in the bundle
  [TMPL_static_files].forEach((f) => {
    // In Windows, the runfile will probably not be symlinked. Se we need to
    // serve the real file through karma, and proxy calls to the expected file
    // location in the runfiles to the real file.
    const resolvedFile = require.resolve(f);
    files.push({pattern: resolvedFile, included: false});
    // Prefixing the proxy path with '/absolute' allows karma to load local
    // files. This doesn't see to be an official API.
    // https://github.com/karma-runner/karma/issues/2703
    proxies['/base/' + f] = '/absolute' + resolvedFile;
  });

  var requireConfigContent = `
// A simplified version of Karma's requirejs.config.tpl.js for use with Karma under Bazel.
// This does an explicit \`require\` on each test script in the files, otherwise nothing will be loaded.
(function(){
  var allFiles = [TMPL_user_files];
  var allTestFiles = [];
  allFiles.forEach(function (file) {
    if (/[^a-zA-Z0-9](spec|test)\\.js$/i.test(file) && !/\\/node_modules\\//.test(file)) {
      allTestFiles.push(file.replace(/\\.js$/, ''))
    }
  });
  require(allTestFiles, window.__karma__.start);
})();
`;

  const requireConfigFile = tmp.fileSync(
      {keep: false, postfix: '.js', dir: process.env['TEST_TMPDIR']});
  fs.writeFileSync(requireConfigFile.name, requireConfigContent);
  files.push(requireConfigFile.name);

  module.exports = function(config) {
    const configuration = {
      // list of karma plugins
      plugins: [
        'karma-*',
        '@bazel/karma',
        'karma-sourcemap-loader',
        'karma-chrome-launcher',
        'karma-firefox-launcher',
        'karma-sauce-launcher',
      ],

      // list of karma preprocessors
      preprocessors: {'**/*.js': ['sourcemap']},

      // list of test frameworks to use
      frameworks: ['jasmine', 'concat_js'],

      // test results reporter to use
      // possible values: 'dots', 'progress'
      // available reporters: https://npmjs.org/browse/keyword/karma-reporter
      reporters: ['progress'],

      // web server port
      port: 9876,

      // enable / disable colors in the output (reporters and logs)
      colors: true,

      // level of logging
      // possible values: config.LOG_DISABLE || config.LOG_ERROR ||
      // config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
      logLevel: config.LOG_INFO,

      // enable / disable watching file and executing tests whenever any file
      // changes
      autoWatch: true,

      // start these browsers
      // available browser launchers:
      // https://npmjs.org/browse/keyword/karma-launcher
      browsers: browsers,

      // Continuous Integration mode
      // if true, Karma captures browsers, runs the tests and exits
      // note: run_karma.sh may override this as a command-line option.
      singleRun: false,

      // Concurrency level
      // how many browser should be started simultaneous
      concurrency: Infinity,

      // base path that will be used to resolve all patterns (eg. files,
      // exclude)
      basePath: 'TMPL_runfiles_path',

      // list of files passed to karma; these are concatenated into a single
      // file by karma-concat-js
      files,
      proxies,
    }

    if (process.env['IBAZEL_NOTIFY_CHANGES'] === 'y') {
      // Tell karma to only listen for ibazel messages on stdin rather than
      // watch all the input files This is from fork alexeagle/karma in the
      // ibazel branch:
      // https://github.com/alexeagle/karma/blob/576d262af50b10e63485b86aee99c5358958c4dd/lib/server.js#L172
      configuration.watchMode = 'ibazel';
    }

    // Extra configuration is needed for saucelabs
    // See: https://github.com/karma-runner/karma-sauce-launcher
    if (customLaunchers) {
      // set the test name for sauce labs to use
      // TEST_BINARY is set by Bazel and contains the name of the test
      // target posfixed with the the browser name such as
      // 'examples/testing/testing_sauce_chrome-win10' for the
      // test target examples/testing:testing
      configuration.sauceLabs = {
        testName: process.env['TEST_BINARY'] || 'ts_web_test_suite'
      };

      // setup the custom launchers for saucelabs
      configuration.customLaunchers = customLaunchers;

      // add the saucelabs reporter
      configuration.reporters.push('saucelabs');
    }

    config.set(configuration);
  }
} catch (e) {
  console.error('Error in karma configuration', e.toString());
  throw e;
}
