#!/usr/bin/env groovy
//-------------------------------------------------------------------------------
// Copyright (c) 2020-2024, Arm Limited and Contributors. All rights reserved.
//
// SPDX-License-Identifier: BSD-3-Clause
//
//-------------------------------------------------------------------------------

@Library('trustedfirmware') _
import org.trustedfirmware.Gerrit

failure_states = ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]

@NonCPS
def isPerPatchJob() {
  def upstream_jobs = manager.build.getAction(hudson.model.CauseAction.class).getCauses()
  if (upstream_jobs.size() > 0 && upstream_jobs[0] instanceof hudson.model.Cause.UpstreamCause) {
    print("Parent project cause: ")
    println(upstream_jobs[0].upstreamProject)
    if (upstream_jobs[0].upstreamProject.endsWith("tf-m-static")) {
      return true
    }
  }
  return false
}

def submit_lava_tests(config, results, build_res, params, params_collection) {
  print("Doing LAVA stuff for ${build_res.getAbsoluteUrl()}")
  params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
  params += string(name: 'BUILD_URL', value: build_res.getAbsoluteUrl())
  params += string(name: 'LAVA_URL', value: env.LAVA_URL)
  params += string(name: 'CI_SCRIPTS_REPO', value: env.CI_SCRIPTS_REPO)
  params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
  params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
  params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
  params += string(name: 'DEVICE_FILTER', value: env.DEVICE_FILTER)
  def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
  def lava_resubmitted = false
  if (lava_res.result in failure_states) {
    error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
  } else {
    lava_des = lava_res.getDescription()
    if (lava_des.contains(" Submitted twice!")) {
      lava_resubmitted = true
      lava_des = lava_des - " Submitted twice!"
    }
    results['lava_jobs'] += lava_des
  }
  links = "Build Config: ${config}\n"
  links += "Build URL: ${build_res.getAbsoluteUrl()}\n"
  links += "LAVA Submit: ${lava_res.getAbsoluteUrl()}"
  if (lava_resubmitted) {
    links += "\nLAVA Job Re-Submitted!"
  }
  print(links)
}

def listConfigs(config_list, filter_group) {
  // In case filter group starts with spaces
  config_groups = filter_group.replaceAll(/^\s+/, '')
  // In case filter group ends with spaces
  config_groups = config_groups.replaceAll(/\s+$/, '')
  // Replace spaces between config group names with ' -g '
  config_groups = config_groups.replaceAll(/\s+/, " -g ")

  def build_config_list_raw = sh(script:
    """
    python3 ./tf-m-ci-scripts/configs.py -g ${config_groups}\n
    """, returnStdout: true).trim()
  def build_config_list = build_config_list_raw.tokenize('\n')
  config_list.addAll(build_config_list)
}

def obtainBuildParams(config) {
  def build_params = [:]
  build_config_params = sh(script:
    """
    python3 ./tf-m-ci-scripts/configs.py --config_params ${config}\n
    """, returnStdout: true).trim()
  def lines = build_config_params.tokenize('\n')
  for (String line : lines) {
    def key, value
    (key, value) = line.tokenize('=')
    build_params[key] = value
  }
  return build_params
}

def buildConfig(config, results) {
  def params = []
  params_collection = obtainBuildParams(config)
  params_collection.each { param ->
    params += string(name: param.key, value:param.value)
  }
  params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
  params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
  params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
  params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
  params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
  params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
  params += string(name: 'CODE_REPO', value: env.CODE_REPO)
  params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
  params += string(name: 'CI_SCRIPTS_REPO', value: env.CI_SCRIPTS_REPO)
  params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
  params += string(name: 'MCUBOOT_REFSPEC', value: env.MCUBOOT_REFSPEC)
  params += string(name: 'MCUBOOT_URL', value: env.MCUBOOT_URL)
  params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
  params += string(name: 'MBEDTLS_URL', value: env.MBEDTLS_URL)
  params += string(name: 'TFM_EXTRAS_REFSPEC', value: env.TFM_EXTRAS_REFSPEC)
  params += string(name: 'TFM_EXTRAS_URL', value: env.TFM_EXTRAS_URL)
  params += string(name: 'TFM_TOOLS_REFSPEC', value: env.TFM_TOOLS_REFSPEC)
  params += string(name: 'TFM_TOOLS_URL', value: env.TFM_TOOLS_URL)
  params += string(name: 'TFM_TESTS_REFSPEC', value: env.TFM_TESTS_REFSPEC)
  params += string(name: 'TFM_TESTS_URL', value: env.TFM_TESTS_URL)
  params += string(name: 'PSA_ARCH_TESTS_VERSION', value: env.PSA_ARCH_TESTS_VERSION)
  params += string(name: 'PSA_ARCH_TESTS_URL', value: env.PSA_ARCH_TESTS_URL)
  params += string(name: 'QCBOR_VERSION', value: env.QCBOR_VERSION)
  params += string(name: 'QCBOR_URL', value: env.QCBOR_URL)
  params += string(name: 'SHARE_FOLDER', value: env.SHARE_FOLDER)
  return { -> results
    def build_res = build(job: 'tf-m-build-config', parameters: params, propagate: false)
    def build_url = build_res.getAbsoluteUrl()
    results['builds'][config] = build_res

    print("${build_res.number}: ${config} ${build_res.result} ${build_url}")

    // Filter out configs do not need LAVA tests

    // Configs with build failure do not need LAVA tests
    if (build_res.result in failure_states) {
      error("Build failed at ${build_url}")
    } else {
        // Build successful
        // Job tf-m-extra-build does not need LAVA tests
        if (env.JOB_NAME.equals("tf-m-extra-build")) {
          print("LAVA is not needed in tf-m-extra-build job.")
        }
        // Submit LAVA tests
        else {
          submit_lava_tests(config, results, build_res, params, params_collection)
        }
    }
  }
}

def buildDocs(results) {
  def params = []
  params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
  params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
  params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
  params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
  params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
  params += string(name: 'CODE_REPO', value: env.CODE_REPO)
  params += string(name: 'CI_SCRIPTS_REPO', value: env.CI_SCRIPTS_REPO)
  params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
  params += string(name: 'SHARE_FOLDER', value: env.SHARE_FOLDER)
  return { -> results
    def res = build(job: 'tf-m-build-docs', parameters: params, propagate:false)
    print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
    results['docs'] = [res.number, res.result, params]
    if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
      error("Build failed at ${res.getAbsoluteUrl()}")
    }
  }
}

def generateEmailBody(stage, results) {
  // Results format: [CONFIG_NAME: [URL: "", RESULT: "", ...]]
  failed_jobs = ""
  results.each { job ->
    if (job.value['RESULT'] == 'FAILURE') {
      failed_jobs += "${job.key}  ${job.value['URL']}\n"
    }
  }

  if (failed_jobs == "") {
    return ""
  }

  body = "Check console output at ${env.BUILD_URL} \n\n"
  body += "Failed Jobs:\n${failed_jobs}"
  body += "\nFor detailed ${stage} results please refer to \
           ${env.BUILD_URL}artifact/${stage}_results.csv \n"
  return body
}

def emailNotification(stage, results) {
  script {
   if (env.EMAIL_NOTIFICATION) {
      email_body = generateEmailBody(stage, results)
      if (email_body == "") {
        print("Skip sending email notification as no failed jobs for ${stage}")
      }
      else {
        emailext (
            subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} fail"),
            body: email_body,
            to: "${EMAIL_NOTIFICATION}"
        )
      }
    }
  } /* script */
}

def parseTestResults(output) {
  def test_results = [:]
  records = output.split('\nLAVA Test Config:\n')
  if (records.size() < 2) {
    return test_results
  }
  records[1..-1].each { record ->
    config_name = ""
    metadata = [:]
    record.split('\n').each { line ->
      record_metadata = line.split(': ')
      // Skip lines which are not "metadata"
      if (record_metadata.size() < 2) {
        return
      }
      if (record_metadata[0] == 'Config Name') {
        config_name = record_metadata[1]
      } else {
        metadata[record_metadata[0]] = record_metadata[1]
      }
    }
    test_results[config_name] = ['URL': metadata['LAVA link'],
                                 'RESULT': metadata['Test Result']]
  }

  writeCsv(test_results, "test_results.csv")

  return test_results
}

def verifyTestStatus(output) {
  g = new Gerrit()
  if (output.contains('FAILURE')) {
    score = -1
  } else {
    score = 1
  }
  g.verifyStatus(score, "lava_test", "test")
  if (score < 0) {
    error("Marking job as failed due to failed tests.")
  }
}

def generateCsvContent(results) {
  // Results format: [CONFIG_NAME: [URL: "", RESULT: "", ...]]
  // CSV format: CONFIG_NAME, RESULT
  csv_header = obtainBuildParams(results.keySet()[0]).keySet().toList()
  csv_header.add('RESULT')
  csv_content = [csv_header]
  results.each { result ->
    build_params = []
    obtainBuildParams(result.key).each { config ->
      build_params.add(config.value)
    }
    build_params.add(result.value['RESULT'])
    csv_content.add(build_params)
  }
  return csv_content
}

def generateHtmlContent(results) {
  // Results format: [CONFIG_NAME: [URL: "", RESULT: "", ...]]
  // HTML format: CONFIG_NAME: Job/Logs/Artifacts RESULT
  htmlContent = []
  results.each { result ->
    htmlContent.add("${result.key}: <a href=\"${result.value['URL']}\">Job</a>/<a href=\"${result.value['URL']}/consoleText\">Logs</a>/<a href=\"${result.value['URL']}/artifact/\">Artifacts</a> ${result.value['RESULT']}<br/>")
  }
  htmlContent.sort()
  return htmlContent.join("\n")
}

def writeCsv(results, file_name) {
  def csvContent = generateCsvContent(results)
  writeCSV file: file_name, records: csvContent, format: CSVFormat.EXCEL
  sh(script: """./tf-m-ci-scripts/report_parser/report_csv_helper.py \
                --input-file ${file_name} --output-file ${file_name} \
             """, returnStdout: true)
  archiveArtifacts file_name
}

def writeHTML(results, file_name) {
def buildLinks = generateHtmlContent(results)
  writeFile file: file_name, text: buildLinks
  archiveArtifacts file_name
}

def lineInString(string, match) {
  def lines = string.split("\n")
  def result = lines.findAll { it.contains(match) }
  return result[0]
}

def getResult(string, match) {
  line = lineInString(string, match)
  a = line.split(match)[1].split(' ')
  score = a[0]
  if (a.size() > 1)
  {
    fail_text = a[1..-1].join(" ")
    return [score, fail_text]
  }
  return [score, ""]
}

def submitJobsToList(results) {
  def all_jobs = []
  for (String result : results){
    jobs_s = result.split('JOBS: ')
    if (jobs_s.size() > 1) {
      all_jobs += jobs_s[1]
    }
  }
  return(all_jobs)
}

def configs = []
def builds = [:]
def results = [:]

timestamps {
  node("docker-amd64-tf-m-jammy") {
    stage("Init") {
      cleanWs()
      dir("tf-m-ci-scripts") {
        checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
        sh "git rev-parse --short HEAD"
        // Clone TF-M repositories so share folder can be reused by downstream jobs
        sh "./clone.sh"
      }
    }

    stage("Configs") {
      dir(".") {
        // Populate configs
        listConfigs(configs, env.FILTER_GROUP)
        results['builds'] = [:]
        results['lava_jobs'] = []
        for (config in configs) {
          builds[config] = buildConfig(config, results)
        }
        if (!env.JOB_NAME.equals("tf-m-extra-build")) {
          builds["docs"] = buildDocs(results)
        }
      }
    }

    stage("Builds") {
      def verify = 1
      def success = true
      dir(".") {
        try {
          parallel(builds)
        } catch (Exception e) {
          print(e)
          manager.buildFailure()
          verify = -1
          success = false
        } finally {
          print("Verifying status")
          g = new Gerrit()
          g.verifyStatus(verify, 'tf-m-build', 'build')
          print("Generating build results summary.")
          def build_results_for_summary = [:]
          results['builds'].each { build ->
            build_results_for_summary[build.key] = ['URL': build.value.getAbsoluteUrl(),
                                                    'RESULT': build.value.result]
          }
          emailNotification('build', build_results_for_summary)
          writeCsv(build_results_for_summary, "build_results.csv")
          writeHTML(build_results_for_summary, "build_links.html")
        }
      }
    }

    stage("Tests") {
      dir("tf-m-ci-scripts") {
        checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
      }
      def all_jobs = []
      def success = true
      def test_results = [:]
      print("Wait for LAVA results here...")
      try {
        all_jobs = submitJobsToList(results['lava_jobs'])
        output = ""
        if (all_jobs.size() > 0) {
          dir(".") {
            if (isPerPatchJob()) {
              lava_timeout = 2700     // 45min
            } else {
              lava_timeout = 19800    // 5.5h
            }
            withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
              sh(script: """./tf-m-ci-scripts/lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
                         --lava-url ${env.LAVA_URL} --lava-user \${LAVA_USER} --lava-token \${LAVA_TOKEN} \
                         --artifacts-path cfgs --lava-timeout ${lava_timeout} > output.log
                         """)
              if (env.CODE_COVERAGE_EN == "TRUE") {
                println("Producing merged report")
                sh(script: """./tf-m-ci-scripts/lava_helper/codecov_merge.sh""")
                archiveArtifacts artifacts: 'merged_report/**', allowEmptyArchive: true
              }
            }
            if (env.JOB_NAME.equals("tf-m-nightly-performance")) {
              withCredentials([string(credentialsId: 'QA_REPORTS_TOKEN', variable: 'TOKEN')]) {
                sh(script: """./tf-m-ci-scripts/performance.py --send-squad --squad-token ${TOKEN} > SQUAD.log""")
              }
            }
          }
        }
        else {
          print("There were no LAVA jobs to test.")
        }
      }
      catch (Exception e) {
        println("ERROR: ${e}")
        // We don't print stacktrace, because Jenkins pipeline use CPS conversion
        // of the Groovy code, which leads to incomprehensible stacktraces.
        //print(hudson.Functions.printThrowable(org.codehaus.groovy.runtime.StackTraceUtils.sanitize(e)))
        success = false
      } finally {
        if (all_jobs.size() > 0) {
          output = readFile("output.log")
          println("--- output from lava_wait_jobs.py ---")
          println(output)
          println("--- end of output from lava_wait_jobs.py ---")
          test_results = parseTestResults(output)

          if (env.JOB_NAME.equals("tf-m-nightly-performance")) {
            performance_output = readFile("SQUAD.log")
            println("--- output from performance.py ---")
            println(performance_output)
            println("--- end of output from performance.py ---")
          }

          archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
          archiveArtifacts artifacts: 'cfgs/**', allowEmptyArchive: true
          if (all_jobs.size() > 0) {
            emailNotification('test', test_results)
          }
          verifyTestStatus(output)
        }
        cleanWs()
        if (!success) {
          error("There was an Error waiting for LAVA jobs")
        }
      }
    }
  }
}
