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

apply plugin: 'com.palantir.baseline-config'

allprojects {
  apply plugin: 'com.palantir.baseline-idea'
}

subprojects {
  if (it.name == 'iceberg-bom') {
    // the BOM does not build anything, the below plugins are not necessary (and can fail)
    return
  }

  // Currently, if any subproject applies the blanket Baseline plugin, it forces the Baseline plugin
  // to be applied to ALL projects. And we are not prepared to address all of the build errors that
  // occur as a result at this time. Furthermore, baseline-format will not work out of the box for
  // us - see below.

  // Thus we concede to applying all of the Baseline plugins individually on all the projects we are
  // ready to enforce linting on.
  apply plugin: 'org.inferred.processors'
  if (!project.hasProperty('quick')) {
    apply plugin: 'com.palantir.baseline-checkstyle'
    apply plugin: 'com.palantir.baseline-error-prone'
  }
  apply plugin: 'com.palantir.baseline-class-uniqueness'
  apply plugin: 'com.palantir.baseline-reproducibility'
  apply plugin: 'com.palantir.baseline-exact-dependencies'
  apply plugin: 'com.palantir.baseline-release-compatibility'
  apply plugin: 'com.diffplug.spotless'

  pluginManager.withPlugin('com.palantir.baseline-checkstyle') {
    checkstyle {
      // com.palantir.baseline:gradle-baseline-java:4.42.0 (the last version supporting Java 8) pulls
      // in an old version of the checkstyle(9.1), which has this OutOfMemory bug https://github.com/checkstyle/checkstyle/issues/10934.
      // So, override its checkstyle version using CheckstyleExtension to 9.3 (the latest java 8 supported version) which contains a fix.
      toolVersion '9.3'
    }
  }

  pluginManager.withPlugin('com.diffplug.spotless') {
    spotless {
      java {
        target 'src/main/java/**/*.java', 'src/test/java/**/*.java', 'src/jmh/java/**/*.java', 'src/integration/java/**/*.java'
        // we use an older version of google-java-format that is compatible with JDK 8
        googleJavaFormat("1.7")
        removeUnusedImports()
        licenseHeaderFile "$rootDir/.baseline/copyright/copyright-header-java.txt"
      }
    }
  }

  pluginManager.withPlugin('com.palantir.baseline-error-prone') {
    tasks.withType(JavaCompile).configureEach {
      options.errorprone.errorproneArgs.addAll (
          // error-prone is slow, don't run on tests/generated-src/generated
          '-XepExcludedPaths:.*/(test|generated-src|generated)/.*',
          // specific to Palantir
          '-Xep:ConsistentLoggerName:OFF',  // Uses name `log` but we use name `LOG`
          '-Xep:FinalClass:OFF',
          '-Xep:PreferSafeLoggingPreconditions:OFF',
          '-Xep:PreferSafeLoggableExceptions:OFF',
          '-Xep:Slf4jLogsafeArgs:OFF',
          '-Xep:RawTypes:OFF',
          // enforce logging conventions
          '-Xep:LoggerEnclosingClass:ERROR',
          '-Xep:PreferStaticLoggers:ERROR',
          '-Xep:Slf4jThrowable:ERROR',
          // subclasses are not equal
          '-Xep:EqualsGetClass:OFF',
          // prefer method references over lambdas
          '-Xep:LambdaMethodReference:ERROR',
          // patterns that are allowed
          '-Xep:MissingCasesInEnumSwitch:OFF',
          //Added because it errors out compile, but we need to figure out if we want it
          '-Xep:StrictUnusedVariable:OFF',
          '-Xep:TypeParameterShadowing:OFF',
          '-Xep:TypeParameterUnusedInFormals:OFF',
          '-Xep:DangerousThreadPoolExecutorUsage:OFF',
          // Enforce hashCode over hash
          '-Xep:ObjectsHashCodeUnnecessaryVarargs:ERROR',
          '-Xep:PreferSafeLogger:OFF',
          // Enforce safe string splitting
          '-Xep:StringSplitter:ERROR',
          // Enforce missing override
          '-Xep:MissingOverride:ERROR',
          '-Xep:IntLongMath:ERROR',
          '-Xep:MissingSummary:ERROR',
          '-Xep:AnnotateFormatMethod:ERROR',
          '-Xep:CollectionUndefinedEquality:ERROR',
      )
    }
  }

  pluginManager.withPlugin('com.github.alisiikh.scalastyle') {
    scalastyle {
      config = file("${rootDir}/project/scalastyle_config.xml")
      inputEncoding = 'UTF-8'
      outputEncoding = 'UTF-8'
      failOnWarning = false
      verbose = false
      quiet = false
    }
  }
}
