// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(function(){

function addTableEntry(elem, title, linkHref, linkText) {
  if (elem.children.length != 2){
    elem.innerHTML = "";
    var newCol = document.createElement("td");
    elem.appendChild(newCol);
    newCol = document.createElement("td");
    var newLink = document.createElement("a");
    newCol.appendChild(newLink);
    elem.appendChild(newCol);
  }

  var first = elem.children[0];
  var link = elem.children[1].children[0];

  first.innerText = title;

  link.href = linkHref;
  link.innerText = linkText;
  link.rel = "noopener";
  link.target = "_blank";
}

function drawExtraTableEntries(jobID, gerritIssue, gerritPatchSet, sourceRepo, sourceRevision, retryOf, parentTaskId, thisTaskId) {
  var elem = document.getElementById("extra_task_scheduler");
  if (jobID) {
    var link = "https://task-scheduler.skia.org/job/" + jobID;
    addTableEntry(elem, "Forced Job ID", link, jobID);
  } else {
    elem.innerHTML = "";
  }

  elem = document.getElementById("extra_gerrit");
  if (gerritIssue && gerritPatchSet) {
    var link = `https://skia-review.googlesource.com/c/${gerritIssue}/${gerritPatchSet}`;
    addTableEntry(elem, "Associated CL", link, "review.skia.org/" + gerritIssue);
  } else {
    elem.innerHTML = "";
  }

  elem = document.getElementById("extra_commit");
  if (sourceRepo && sourceRevision && gerritIssue && gerritPatchSet) {
    var key = "Commit Patchset Was Applied To";
    var link = sourceRepo.replace("%s", sourceRevision);
    var shortRevision = sourceRevision.substring(0, 12);
    addTableEntry(elem, key, link, shortRevision);
  } else {
    elem.innerHTML = "";
  }

  elem = document.getElementById("extra_retry_of");
  if (retryOf) {
    var link = `https://chromium-swarm.appspot.com/tasklist?c=name&c=state&c=created_ts&c=user&f=sk_id%3A${retryOf}&l=10&s=created_ts%3Adesc`;
    addTableEntry(elem, "Retry of Task", link, retryOf);
  } else {
    elem.innerHTML = "";
  }

  elem = document.getElementById("extra_depends_on");
  if (parentTaskId) {
    var link = `https://chromium-swarm.appspot.com/tasklist?c=name&c=state&c=created_ts&c=user&f=sk_id%3A${parentTaskId}&l=10&s=created_ts%3Adesc`;
    addTableEntry(elem, "Parent Task", link, parentTaskId);
  } else {
    elem.innerHTML = "";
  }

  elem = document.getElementById("extra_dependents");
  if (thisTaskId) {
    var link = `https://chromium-swarm.appspot.com/tasklist?c=name&c=state&c=created_ts&c=user&f=sk_parent_task_id%3A${thisTaskId}&l=10&s=created_ts%3Adesc`;
    addTableEntry(elem, "Child Tasks", link, "Find in Task List");
  } else {
    elem.innerHTML = "";
  }
}

function createExtraRow(parentNode, newID) {
  var newRow = document.createElement("tr");
  newRow.className = "outline";
  newRow.id = newID;
  parentNode.appendChild(newRow);
}

window.addEventListener("WebComponentsReady", function(e) {
  // Create our extra <tr> elements.
  var moreDetails = document.getElementById("more_details");
  createExtraRow(moreDetails.parentNode, "extra_task_scheduler");
  createExtraRow(moreDetails.parentNode, "extra_gerrit");
  createExtraRow(moreDetails.parentNode, "extra_commit");
  createExtraRow(moreDetails.parentNode, "extra_retry_of");
  createExtraRow(moreDetails.parentNode, "extra_depends_on");
  createExtraRow(moreDetails.parentNode, "extra_dependents");

  window.setInterval(function(){
    var id = document.querySelector(".swarming-app input").value;

    if (!id) {
      return;
    }

    // a map of all task tags_
    var skData = {};

    // The tbody #more_details has all of the tags in it, which are in the form
    // tag:value.  We iterate through all of the tds looking for those that
    // are needed to render our extra <tr> elements.
    var cells = moreDetails.getElementsByTagName("td");
    for (var i = 0; i < cells.length; i++) {
      var content = cells[i].textContent.trim();
      var split = content.split(":", 1);
      var tag = split[0];
      var rest = content.substring(tag.length + 1);
      skData[tag] = rest;
    }

    drawExtraTableEntries(
        skData.sk_forced_job_id,
        skData.sk_issue,
        skData.sk_patchset,
        skData.source_repo,
        skData.source_revision,
        skData.sk_retry_of,
        skData.sk_parent_task_id,
        skData.sk_id);
  }, 100);

});
})();

