// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function getArguments() {
  // Returns the URL arguments as a dictionary.
  args = {}
  var s = location.search;
  if (s) {
    var vals = s.substring(1).split('&');
    for (var i = 0; i < vals.length; i++) {
      var pair = vals[i].split('=');
      args[pair[0]] = pair[1];
    }
  }
  return args;
}

function showSuiteTable(show_the_table) {
    document.getElementById('suite-table').style.display = (
        show_the_table ? 'table' : 'none');
}

function showTestTable(show_the_table) {
    document.getElementById('test-table').style.display = (
        show_the_table ? 'table' : 'none');
}

function showTestsOfOneSuiteOnly(suite_name) {
  setTitle('Test Results of Suite: ' + suite_name)
  show_all = (suite_name == 'TOTAL')
  var testTableBlocks = document.getElementById('test-table')
      .getElementsByClassName('row_block');
  Array.prototype.slice.call(testTableBlocks)
      .forEach(function(testTableBlock) {
        if (!show_all) {
          var table_block_in_suite = (testTableBlock.firstElementChild
            .firstElementChild.firstElementChild.innerHTML)
            .startsWith(suite_name);
          if (!table_block_in_suite) {
            testTableBlock.style.display = 'none';
            return;
          }
        }
        testTableBlock.style.display = 'table-row-group';
      });
  showTestTable(true);
  showSuiteTable(false);
  window.scrollTo(0, 0);
}

function showTestsOfOneSuiteOnlyWithNewState(suite_name) {
  showTestsOfOneSuiteOnly(suite_name);
  history.pushState({suite: suite_name}, suite_name, '');
}

function showSuiteTableOnly() {
  setTitle('Suites Summary')
  showTestTable(false);
  showSuiteTable(true);
  window.scrollTo(0, 0);
}

function showSuiteTableOnlyWithReplaceState() {
  showSuiteTableOnly();
  history.replaceState({}, 'suite_table', '');
}

function setBrowserBackButtonLogic() {
  window.onpopstate = function(event) {
    if (!event.state || !event.state.suite) {
      showSuiteTableOnly();
    } else {
      showTestsOfOneSuiteOnly(event.state.suite);
    }
  };
}

function setTitle(title) {
  document.getElementById('summary-header').textContent = title;
}

function sortByColumn(head) {
  var table = head.parentNode.parentNode.parentNode;
  var rowBlocks = Array.prototype.slice.call(
      table.getElementsByTagName('tbody'));

  // Determine whether to asc or desc and set arrows.
  var headers = head.parentNode.getElementsByTagName('th');
  var headIndex = Array.prototype.slice.call(headers).indexOf(head);
  var asc = -1;
  for (var i = 0; i < headers.length; i++) {
    if (headers[i].dataset.ascSorted != 0) {
      if (headers[i].dataset.ascSorted == 1) {
          headers[i].getElementsByClassName('up')[0]
              .style.display = 'none';
      } else {
        headers[i].getElementsByClassName('down')[0]
            .style.display = 'none';
      }
      if (headers[i] == head) {
        asc = headers[i].dataset.ascSorted * -1;
      } else {
        headers[i].dataset.ascSorted = 0;
      }
      break;
    }
  }
  headers[headIndex].dataset.ascSorted = asc;
  if (asc == 1) {
      headers[headIndex].getElementsByClassName('up')[0]
          .style.display = 'inline';
  } else {
      headers[headIndex].getElementsByClassName('down')[0]
          .style.display = 'inline';
  }

  // Sort the array by the specified column number (col) and order (asc).
  rowBlocks.sort(function (a, b) {
    if (a.style.display == 'none') {
      return -1;
    } else if (b.style.display == 'none') {
      return 1;
    }
    var a_rows = Array.prototype.slice.call(a.children);
    var b_rows = Array.prototype.slice.call(b.children);
    if (head.className == "text") {
      // If sorting by text, we only compare the entry on the first row.
      var aInnerHTML = a_rows[0].children[headIndex].innerHTML;
      var bInnerHTML = b_rows[0].children[headIndex].innerHTML;
      return (aInnerHTML == bInnerHTML) ? 0 : (
          (aInnerHTML > bInnerHTML) ? asc : -1 * asc);
    } else if (head.className == "number") {
      // If sorting by number, for example, duration,
      // we will sum up the durations of different test runs
      // for one specific test case and sort by the sum.
      var avalue = 0;
      var bvalue = 0;
      a_rows.forEach(function (row, i) {
        var index = (i > 0) ? headIndex - 1 : headIndex;
        avalue += Number(row.children[index].innerHTML);
      });
      b_rows.forEach(function (row, i) {
        var index = (i > 0) ? headIndex - 1 : headIndex;
        bvalue += Number(row.children[index].innerHTML);
      });
    } else if (head.className == "flaky") {
      // Flakiness = (#total - #success - #skipped) / (#total - #skipped)
      var a_success_or_skipped = 0;
      var a_skipped = 0;
      var b_success_or_skipped = 0;
      var b_skipped = 0;
      a_rows.forEach(function (row, i) {
        var index = (i > 0) ? headIndex - 1 : headIndex;
        var status = row.children[index].innerHTML.trim();
        if (status == 'SUCCESS') {
          a_success_or_skipped += 1;
        }
        if (status == 'SKIPPED') {
          a_success_or_skipped += 1;
          a_skipped += 1;
        }
      });
      b_rows.forEach(function (row, i) {
        var index = (i > 0) ? headIndex - 1 : headIndex;
        var status = row.children[index].innerHTML.trim();
        if (status == 'SUCCESS') {
          b_success_or_skipped += 1;
        }
        if (status == 'SKIPPED') {
          b_success_or_skipped += 1;
          b_skipped += 1;
        }
      });
      var atotal_minus_skipped = a_rows.length - a_skipped;
      var btotal_minus_skipped = b_rows.length - b_skipped;

      var avalue = ((atotal_minus_skipped == 0) ? -1 :
          (a_rows.length - a_success_or_skipped) / atotal_minus_skipped);
      var bvalue = ((btotal_minus_skipped == 0) ? -1 :
          (b_rows.length - b_success_or_skipped) / btotal_minus_skipped);
    }
    return asc * (avalue - bvalue);
  });

  for (var i = 0; i < rowBlocks.length; i++) {
    table.appendChild(rowBlocks[i]);
  }
}

function sortSuiteTableByFailedTestCases() {
  sortByColumn(document.getElementById('number_fail_tests'));
}
