/*jslint indent: 2, maxlen: 80, sloppy: true */
/*global require, phantom, document, console, setInterval, clearInterval */

var system = require('system');

/**
 * Wait until the test condition is true or a timeout occurs. Useful for waiting
 * on a server response or for a ui change (fadeIn, etc.) to occur.
 *
 * @method waitFor
 * @param {Function} testFx Condition that evaluates to a boolean
 * @param {Function} onReady What to do when testFx condition is fulfilled
 * @param {Number} time_out_millis The max amount of time to wait.
 *                                 If not specified, 10 sec is used.
 */
function waitFor(testFx, onReady, time_out_millis) {
  var maxtime_out_millis, start, condition, interval;
  maxtime_out_millis = time_out_millis || (5 * 60 * 1000 + 1);
  start = new Date().getTime();
  condition = false;
  interval = setInterval(function () {
    if ((new Date().getTime() - start < maxtime_out_millis) && !condition) {
      // If not time-out yet and condition not yet fulfilled
      condition = testFx();
    } else {
      if (!condition) {
        // If condition still not fulfilled (timeout but condition is 'false')
        console.log("'waitFor()' timeout");
        phantom.exit(1);
      } else {
        // Condition fulfilled (timeout and/or condition is 'true')
        console.log("'waitFor()' finished in " +
                    (new Date().getTime() - start) + "ms.");
        onReady();
        clearInterval(interval); //< Stop this interval
      }
    }
  }, 100); //< repeat check every 100ms
}

if (system.args.length !== 2) {
  console.log('Usage: run-qunit.js URL');
  phantom.exit(1);
}

var page = require('webpage').create();

// Route "console.log()" calls from within the Page context to the main Phantom
// context (i.e. current "this")
page.onConsoleMessage = function (msg) {
  console.log(msg);
};

page.open(system.args[1], function (status) {
  if (status !== "success") {
    console.log("Unable to access network");
    phantom.exit(1);
  }
  waitFor(function () {
    return page.evaluate(function () {
      var el = document.getElementById('qunit-testresult');
      if (el && el.innerText.match('completed')) {
        return true;
      }
      return false;
    });
  }, function () {
    var failedNum = page.evaluate(function () {
      console.log("========================================================");
      console.log("<!DOCTYPE html><html>");
      console.log(document.documentElement.innerHTML);
      console.log("</html>");
      console.log("========================================================");
      var el = document.getElementById('qunit-testresult');
      console.log(el.innerText);
      try {
        return el.getElementsByClassName('failed')[0].innerHTML;
      } catch (ignore) {}
      return 10000;
    });
    phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0);
  });
});
