// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Step to report failure of a set of jobs and comparing the result with
// the latest jobs with the same name on another folder
import build.bazel.ci.JenkinsUtils

@NonCPS
def formatRun(run) {
  if (run == null) {
    return "unkown status"
  }
  def consoleUrl = "${run.absoluteUrl}console"
  def name = java.net.URLEncoder.encode(run.fullProjectName, "UTF-8")
  def runUrl = "/blue/organizations/jenkins/${name}/detail/${run.projectName}/${run.number}/pipeline/"
  def resultImg = "${Jenkins.RESOURCE_PATH}/images/16x16/${run.rawBuild.getIconColor()}.png"
  return "<a href=\"${consoleUrl}\"><img src=\"${resultImg}\"/></a> <a href=\"${runUrl}\">#${run.number}</a>"
}

@NonCPS
def collectJobs(report, beforeFolder) {
  def successes = []
  def failures = []
  def alreadyFailing = []
  for (e in report) {
    def key = e.key
    def value = e.value
    def beforeJob = JenkinsUtils.getLastRun(beforeFolder, key)
    def element = "${key} ${formatRun(value)} (was ${formatRun(beforeJob)})"
    if (value.result == "SUCCESS") {
      successes <<= element
    } else if (beforeJob == null || beforeJob.rawBuild.result.isWorseOrEqualTo(value.rawBuild.result)) {
      alreadyFailing <<= element
    } else {
      failures <<= element
    }
  }
  return [failures: failures, alreadyFailing: alreadyFailing, successes: successes]
}

@NonCPS
def toHTMLList(lst) {
  def listItems = lst.collect { "<li>${it}</li>" }
  return "<ul>${listItems.join('\n')}</ul>"
}

def call(args = [:]) {
  def name = args.name
  def jobs = collectJobs(args.report, args.get("beforeFolder", ""))
  node {
    writeFile file: (".report/${name}.html"), text: """
<html>
<h2>Newly failing jobs</h2>
<ul>${toHTMLList(jobs.failures)}</ul>
<h2>Already failing jobs</h2>
<ul>${toHTMLList(jobs.alreadyFailing)}</ul>
<h2>Passing jobs</h2>
<ul>${toHTMLList(jobs.successes)}</ul>
</html>
"""
    publishHTML target: [
      allowMissing: false,
      alwaysLinkToLastBuild: false,
      keepAll: true,
      reportDir: ".report",
      reportFiles: "${name}.html",
      reportName: name
    ]
  }

  if (args.get("unstableOnNewFailure", true) && !jobs.failures.empty) {
    currentBuild.result = "UNSTABLE"
  }
}
