/*global jasmine, __karma__, window*/
(function () {

// Error.stackTraceLimit = Infinity;

jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;

// Cancel Karma's synchronous start,
// we call `__karma__.start()` later, once all the specs are loaded.
__karma__.loaded = function () { };

// SET THE RUNTIME APPLICATION ROOT HERE
var appRoot ='app'; // no trailing slash!

// RegExp for client application base path within karma (which always starts 'base\')
var karmaBase = '^\/base\/'; // RegEx string for base of karma folders
var appPackage = 'base/' + appRoot; //e.g., base/app
var appRootRe = new RegExp(karmaBase + appRoot + '\/');
var onlyAppFilesRe = new RegExp(karmaBase + appRoot + '\/(?!.*\.spec\.js$)([a-z0-9-_\.\/]+)\.js$');

var moduleNames = [];

// Configure systemjs packages to use the .js extension for imports from the app folder
var packages = {};
packages[appPackage] = {
    defaultExtension: false,
    format: 'register',
    map: Object.keys(window.__karma__.files)
      .filter(onlyAppFiles)
      // Create local module name mapping to karma file path for app files
      // with karma's fingerprint in query string, e.g.:
      // './hero.service': '/base/app/hero.service.js?f4523daf879cfb7310ef6242682ccf10b2041b3e'
      .reduce(function (pathsMapping, appPath) {
        var moduleName = appPath.replace(appRootRe, './').replace(/\.js$/, '');
        pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath];
        return pathsMapping;
      }, {})
  }

System.config({ packages: packages });

// Configure Angular for the browser and
// with test versions of the platform providers
  Promise.all([
    System.import('angular2/testing'),
    System.import('angular2/platform/testing/browser')
  ])
  .then(function (results) {
    var testing = results[0];
    var browser = results[1];
    testing.setBaseTestProviders(
      browser.TEST_BROWSER_PLATFORM_PROVIDERS,
      browser.TEST_BROWSER_APPLICATION_PROVIDERS);

    // Load all spec files
    // (e.g. 'base/app/hero.service.spec.js')
    return Promise.all(
      Object.keys(window.__karma__.files)
        .filter(onlySpecFiles)
        .map(function (moduleName) {
          moduleNames.push(moduleName);
          return System.import(moduleName);
        }));
  })

  .then(success, fail);

////// Helpers //////

function onlyAppFiles(filePath) {
  return onlyAppFilesRe.test(filePath);
}

function onlySpecFiles(filePath) {
  return /\.spec\.js$/.test(filePath);
}

function success () {
  console.log(
    'Spec files loaded:\n  ' +
    moduleNames.join('\n  ') +
    '\nStarting Jasmine testrunner');
  __karma__.start();
}

function fail(error) {
  __karma__.error(error.stack || error);
}

})();
