#!/usr/bin/env groovy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

def call(Map params = [:]) {
  def failingFast = null
  def branchesToNotify = params.containsKey("branchesToNotify") ? params.branchesToNotify : ['master', 'main']
  try {
    def buildProperties = []
    if (env.BRANCH_NAME == 'master') {
      // set build retention time first
      buildProperties.add(buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '5', daysToKeepStr: '15', numToKeepStr: '10')))
      // ensure a build is done every month
      buildProperties.add(pipelineTriggers([cron('@monthly')]))
    } else {
      buildProperties.add(buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '2', daysToKeepStr: '7', numToKeepStr: '3')))
    }
    properties(buildProperties)

    // now determine the matrix of parallel builds
    def oses = params.containsKey('os') ? params.os : ['linux']
    // minimum, LTS, current and next ea
    def jdks = params.containsKey('jdks') ? params.jdks : params.containsKey('jdk') ? params.jdk : ['8','11','17','21']
    def maven = params.containsKey('maven') ? params.maven : '3.9.x'
    def tmpWs = params.containsKey('tmpWs') ? params.tmpWs : false
    def mavenArgs = params.containsKey('mavenArgs') ? params.mavenArgs : ''
    // def failFast = params.containsKey('failFast') ? params.failFast : true
    // Just temporarily
    def failFast = false;

    Map tasks = [failFast: failFast]
    boolean first = true
    for (String os in oses) {
      for (def jdk in jdks) {
        String label = jenkinsEnv.labelForOS(os);
        String jdkName = jenkinsEnv.jdkFromVersion(os, "${jdk}")
        String mvnName = jenkinsEnv.mvnFromVersion(os, "${maven}")
        echo "OS: ${os} JDK: ${jdk} Maven: ${maven} => Label: ${label} JDK: ${jdkName} Maven: ${mvnName}"
        if (label == null || jdkName == null || mvnName == null) {
          echo "Skipping ${os}-jdk${jdk} as unsupported by Jenkins Environment"
          continue;
        }
        def cmd = [
          'mvn', '-V',
          '-P+run-its',
          '-DtrimStackTrace=false', 
          '-Dmaven.test.failure.ignore=true',
          '-Dfindbugs.failOnError=false',
        ]
        if (!first) {
          cmd += '-Dfindbugs.skip=true'
        }
        cmd += 'clean'
        cmd += mavenArgs
        if (env.BRANCH_NAME == 'master' && jdk == '21' && os == 'linux' ) {
          cmd += 'deploy'
        } else {
          cmd += 'verify -Dpgpverify.skip'
        } 
        def disablePublishers = !first
        first = false
        String stageId = "${os}-jdk${jdk}"
        tasks[stageId] = {
          node("${label}") {
            // without this block $WORKSPACE could not work as expected in parallel tasks (https://issues.jenkins-ci.org/plugins/servlet/mobile#issue/JENKINS-33511)
            withEnv(["NODE_WORKSPACE=${pwd()}"]) {
              def wsDir = env.NODE_WORKSPACE
              if (!isUnix() && tmpWs) {
                wsDir = 'F:\\short\\' + "$BUILD_TAG".replaceAll(/(.+)-maven-box-maven-(.+)/) { "m-${it[2]}" }
              }
              ws( dir : "$wsDir" ) {
                stage("Build ${stageId}") {
                  if (failingFast != null) {
                    cleanWs()
                    echo "[FAIL FAST] ${failingFast} has failed. Skipping ${stageId}."
                  } else try {
                    // mavenSettingsConfig: 'simple-deploy-settings-no-mirror',
                    withMaven(jdk:jdkName, maven:mvnName, mavenLocalRepo:'.repository',
                              options: [
                                artifactsPublisher(disabled: disablePublishers),
                                junitPublisher(ignoreAttachments: false),
                                findbugsPublisher(disabled: disablePublishers),
                                openTasksPublisher(disabled: disablePublishers),
                                dependenciesFingerprintPublisher(disabled: disablePublishers),
    // DISABLED DUE TO INFRA-17514 invokerPublisher(),
                                pipelineGraphPublisher(disabled: disablePublishers)
                              ], publisherStrategy: 'EXPLICIT') {
                      dir ('m') {
                        checkout scm
                        if (isUnix()) {
                          sh cmd.join(' ')
                        } else {
                          bat cmd.join(' ')
                        }
                      }
                    }
                  } catch (Throwable e) {
                    echo "[FAILURE-004] ${e}"
                    if (!failFast) {
                      throw e
                    } else if (failingFast == null) {
                      failingFast = stageId
                      echo "[FAIL FAST] This is the first failure and likely root cause"
                      throw e
                    } else {
                      echo "[FAIL FAST] ${failingFast} had first failure, ignoring ${e.message}"
                    }
                  } finally {
                    try {
                      cleanWs()
                    } catch(IOException e) {
                      echo "Failed to clean up workspace: ${e}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    // run the parallel builds
    parallel(tasks)

    // JENKINS-34376 seems to make it hard to detect the aborted builds
  } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
    // this ambiguous condition means a user probably aborted
    if (e.causes.size() == 0) {
      currentBuild.result = "ABORTED"
    } else {
      currentBuild.result = "FAILURE"
      echo "[FAILURE-002] FlowInterruptedException ${e}"
    }
    throw e
  } catch (hudson.AbortException e) {
    // this ambiguous condition means during a shell step, user probably aborted
    if (e.getMessage().contains('script returned exit code 143')) {
      currentBuild.result = "ABORTED"
    } else {
      currentBuild.result = "FAILURE"
      echo "[FAILURE-003] AbortException ${e}"
    }
    throw e
  } catch (InterruptedException e) {
    currentBuild.result = "ABORTED"
    throw e
  } catch (Throwable e) {
    currentBuild.result = "FAILURE"
    echo "[FAILURE-001] ${e}"
    throw e
  } finally {
    // notify completion
    if (failingFast != null) {
      echo "***** FAST FAILURE *****\n\nFast failure triggered by ${failingFast}\n\n***** FAST FAILURE *****"
    }
    if (branchesToNotify.contains(env.BRANCH_NAME)) {
      stage("Notifications") {
        jenkinsNotify()
      }
    }
  }
}
