/*
 * 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.
 */

if (jdkVersion != '8' && jdkVersion != '11' && jdkVersion != '17') {
  throw new GradleException("The JMH benchamrks must be run with JDK 8 or JDK 11 or JDK 17")
}

def sparkVersions = (System.getProperty("sparkVersions") != null ? System.getProperty("sparkVersions") : System.getProperty("defaultSparkVersions")).split(",")
def scalaVersion = System.getProperty("scalaVersion") != null ? System.getProperty("scalaVersion") : System.getProperty("defaultScalaVersion")
def jmhProjects = [project(":iceberg-core")]

if (sparkVersions.contains("3.1")) {
  jmhProjects.add(project(":iceberg-spark:iceberg-spark-3.1_2.12"))
}

if (sparkVersions.contains("3.2")) {
  jmhProjects.add(project(":iceberg-spark:iceberg-spark-3.2_${scalaVersion}"))
}

if (sparkVersions.contains("3.3")) {
  jmhProjects.add(project(":iceberg-spark:iceberg-spark-3.3_${scalaVersion}"))
  jmhProjects.add(project(":iceberg-spark:iceberg-spark-extensions-3.3_${scalaVersion}"))
}

if (sparkVersions.contains("3.4")) {
  jmhProjects.add(project(":iceberg-spark:iceberg-spark-3.4_${scalaVersion}"))
  jmhProjects.add(project(":iceberg-spark:iceberg-spark-extensions-3.4_${scalaVersion}"))
}

jmhProjects.add(project(":iceberg-data"))

configure(jmhProjects) {
  apply plugin: 'me.champeau.jmh'
  apply plugin: 'io.morethan.jmhreport'

  def jmhReportDir = project.property("jmhJsonOutputPath").toString().replace(".json", "")
  mkdir(file(jmhReportDir))

  jmh {
    jmhVersion = '1.32'
    failOnError = true
    forceGC = true
    includeTests = true
    humanOutputFile = file(jmhOutputPath)
    resultsFile = file(jmhJsonOutputPath)
    resultFormat = 'JSON'
    includes = [jmhIncludeRegex]
    zip64 = true
  }

  jmhReport {
    jmhResultPath = file(jmhJsonOutputPath)
    jmhReportOutput = file(jmhReportDir)
  }

  jmhCompileGeneratedClasses {
    pluginManager.withPlugin('com.palantir.baseline-error-prone') {
      options.errorprone.enabled = false
    }
  }

  tasks.jmh.finalizedBy tasks.jmhReport
}
