window.HeadlessReporterResult = (function() {

    function HeadlessReporterResult(name, splitName) {
      this.name = name;
      this.splitName = splitName;
      this.results = [];
    }

    HeadlessReporterResult.prototype.addResult = function(message) {
      return this.results.push(message);
    };

    HeadlessReporterResult.prototype.toString = function() {
      var bestChoice, line, output, result, _i, _len, _ref;
      output = "\n" + this.name.foreground('red');
      bestChoice = HeadlessReporterResult.findSpecLine(this.splitName);
      if (bestChoice.file) {
        output += (" (" + bestChoice.file + ":" + bestChoice.lineNumber + ")").foreground('blue');
      }
      _ref = this.results;
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        result = _ref[_i];
        line = result.message.foreground('red');
        if (result.lineNumber) {
          line += (" (line ~" + (bestChoice.lineNumber + result.lineNumber) + ")").foreground('red').bright();
        }
        output += "\n  " + line;
        if (result.line != null) {
          output += ("\n    " + result.line).foreground('yellow');
        }
      }
      return output;
    };

    HeadlessReporterResult.findSpecLine = function(splitName) {
      var bestChoice, file, index, lastLine, line, lineNumber, lines, newLineNumberInfo, _i, _len, _ref;
      bestChoice = {
        accuracy: 0,
        file: null,
        lineNumber: null
      };
      _ref = HeadlessReporterResult.specLineNumbers;
      for (file in _ref) {
        lines = _ref[file];
        index = 0;
        lineNumber = 0;
        while (newLineNumberInfo = lines[splitName[index]]) {
          if (newLineNumberInfo.length === 0) {
            lineNumber = newLineNumberInfo[0];
          } else {
            lastLine = null;
            for (_i = 0, _len = newLineNumberInfo.length; _i < _len; _i++) {
              line = newLineNumberInfo[_i];
              lastLine = line;
              if (line > lineNumber) break;
            }
            lineNumber = lastLine;
          }
          index++;
        }
        if (index > bestChoice.accuracy) {
          bestChoice = {
            accuracy: index,
            file: file,
            lineNumber: lineNumber
          };
        }
        if (index === splitName.length) break;
      }
      return bestChoice;
    };

    return HeadlessReporterResult;

  })();