/*
 * 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.
 */
buildscript {
  repositories {
    maven {
      url = uri("https://plugins.gradle.org/m2/")
    }
  }
  dependencies {
    classpath "${libs.spotbugs.gradle.plugin.get()}"
    classpath "${libs.spotless.plugin.gradle.get()}"
    classpath "${libs.shadow.get()}"
    classpath "${libs.cyclonedx.bom.get()}"
  }
}

assert JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17): "Java 17 or newer is " +
    "required"

allprojects {
  group = "org.apache.spark.k8s.operator"
  version = "0.6.0-SNAPSHOT"
}

tasks.register('buildDockerImage', Exec) {
  String cmd = "docker build --build-arg APP_VERSION=${version} -t apache/spark-kubernetes-operator:${version} -f build-tools/docker/Dockerfile ."
  println "Build Docker Image: $cmd"
  commandLine "sh", "-c", "$cmd"
}

subprojects {
  apply plugin: 'idea'
  apply plugin: 'eclipse'
  apply plugin: 'java'

  java {
    toolchain {
      languageVersion = JavaLanguageVersion.of(25)
      vendor = JvmVendorSpec.AZUL
    }
  }

  tasks.withType(JavaCompile).configureEach {
    options.release = 17
    options.compilerArgs.add("-proc:full")
  }

  repositories {
    // Google Mirror of Maven Central, placed first so that it's used instead of flaky Maven Central.
    // See https://storage-download.googleapis.com/maven-central/index.html
    maven {
      name = "GCS Maven Central mirror"
      url = uri("https://maven-central.storage-download.googleapis.com/maven2/")
    }
    mavenCentral()
  }

  apply plugin: 'checkstyle'
  checkstyle {
    toolVersion = libs.versions.checkstyle.get()
    configFile = file("$rootDir/config/checkstyle/checkstyle.xml")
    ignoreFailures = false
    showViolations = true
  }

  apply plugin: 'pmd'
  pmd {
    ruleSetFiles = files("$rootDir/config/pmd/ruleset.xml")
    toolVersion = libs.versions.pmd.get()
    consoleOutput = true
    ignoreFailures = false
  }

  apply plugin: 'com.github.spotbugs'
  spotbugs {
    toolVersion = libs.versions.spotbugs.tool.get()
    afterEvaluate {
      reportsDir = file("${project.reporting.baseDirectory}/findbugs")
    }
    excludeFilter = file("$rootDir/config/spotbugs/spotbugs_exclude.xml")
    ignoreFailures = false
  }

  apply plugin: 'jacoco'
  jacoco {
    toolVersion = libs.versions.jacoco.get()
  }
  jacocoTestReport {
    dependsOn test
  }

  apply plugin: 'com.diffplug.spotless'
  spotless {
    java {
      endWithNewline()
      googleJavaFormat('1.28.0')
      importOrder(
        'java',
        'javax',
        'scala',
        '',
        'org.apache.spark',
      )
      toggleOffOn()
      targetExclude "**/BaseResource.java"
      trimTrailingWhitespace()
      removeUnusedImports()
    }
  }
}

apply plugin: 'com.diffplug.spotless'
spotless {
  format 'misc', {
    target '*.md', '*.gradle', '**/*.properties', '**/*.xml', '**/*.yaml', '**/*.yml'
    targetExclude "**/.idea/**"
    endWithNewline()
    trimTrailingWhitespace()
  }
}

apply from: 'deploy.gradle'
