var TextReporter = function() {
  this.resultMessage = "";
};

TextReporter.prototype = {
  reportRunnerResults: function(runner) {
    var results = runner.getResults();
    this.resultMessage += "\n\n";

    if (results.passedCount != results.totalCount) {
      this.resultMessage += "FAILURES!\n";
    }

    this.resultMessage += results.passedCount + " of " + results.totalCount + " specs passed\n\n";
  },

  reportSuiteResults: function(suite) {
  },

  reportSpecResults: function(spec) {
    var passed = spec.getResults().passed();
    if (!passed) {
      this.resultMessage += "\n";
    }
    this.resultMessage += passed ? ".    " : "FAIL ";
    this.resultMessage += spec.getFullName();
    this.resultMessage += "\n";

    var resultItems = spec.getResults().getItems();
    for (var i = 0; i < resultItems.length; i++) {
      var result = resultItems[i];
      if (!result.passed) {
        this.resultMessage += this.indent(this.stripHtml(result.message));
        this.resultMessage += "\n";
        this.resultMessage += this.indent(this.stripHtml(result.trace.stack));
        this.resultMessage += "\n";
      }
    }
  },

  log: function(s) {
  },

  indent: function(s) {
    return s.replace(/^(.)|\n/g, "\n       $1");
  },

  stripHtml: function(s) {
    return s.replace(/<(?:.|\s)*?>/g, " ");
  }
};

var JaxerJasmine = function(reporter) {
  this.reporter = reporter;
  this.loadJasmine();
  this.loadTests();
  this.jasmineEnv = jasmine.getEnv();
  this.jasmineEnv.reporter = reporter;
};

JaxerJasmine.prototype = {
  loadJasmine: function() {
    [
      "base.js",
      "util.js",
      "Env.js",
      "ActionCollection.js",
      "Matchers.js",
      "NestedResults.js",
      "PrettyPrinter.js",
      "QueuedFunction.js",
      "Reporters.js",
      "Runner.js",
      "Spec.js",
      "Suite.js"
    ].forEach(function(file) {
      Jaxer.load(Jaxer.Web.resolve("../jaxer-include/test/jasmine/src/" + file));
    });
  },

  loadTests: function() {
    var testFiles = Jaxer.Dir.grep(Jaxer.Web.resolve("../jaxer-include/test/"), { pattern: "^.*-test\\.js$", recursive: true });
    testFiles.forEach(function(testFile) {
      Jaxer.load(testFile.path);
    });
  },

  execute: function() {
    this.jasmineEnv.execute();
  }
};

var reporter = new TextReporter();
var jaxerJasmine = new JaxerJasmine(reporter);
jaxerJasmine.execute();

Jaxer.response.headers['Content-Type'] = 'text/plain';
Jaxer.response.setContents(reporter.resultMessage, 200);
