// 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 console = JenkinsUtils.getConsoleUrl(run)
  def url = JenkinsUtils.getBlueOceanUrl(run)
  def icon = JenkinsUtils.getSmallIconUrl(run)
  return "<a href=\"${console}\"><img src=\"${icon}\"/></a> <a href=\"${url}\">#${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 = [:]) {
  node {
    def name = args.name
    def jobs = collectJobs(args.report, args.get("beforeFolder", ""))
    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"
    }
  }
}
