/*
 * 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 {
  // 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-scalastyle'
  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'

  // Can't use the built-in Baseline spotless format because it's opinionated about the import
  // order of having static imports after non-static imports, and this cannot be overridden.

  // So we apply Spotless manually to get a similar effect to baseline-format, but change the
  // import order.
  pluginManager.withPlugin('com.diffplug.gradle.spotless') {
    spotless {
      java {
        target 'src/main/java/**/*.java', 'src/test/java/**/*.java', 'src/jmh/java/**/*.java'
        removeUnusedImports()
        importOrder '', 'static '
        trimTrailingWhitespace()
        indentWithSpaces 2
        endWithNewline()
      }
    }
  }

  pluginManager.withPlugin('com.palantir.baseline-error-prone') {
    tasks.withType(JavaCompile).configureEach {
      options.errorprone.errorproneArgs.addAll (
          // error-prone is slow, don't run on tests and generated src
          '-XepExcludedPaths:.*/(test|generated-src)/.*',
          // specific to Palantir
          '-Xep:FinalClass:OFF',
          '-Xep:PreferSafeLoggingPreconditions:OFF',
          '-Xep:PreferSafeLoggableExceptions:OFF',
          '-Xep:Slf4jLogsafeArgs:OFF',
          '-Xep:RawTypes:OFF',
          // subclasses are not equal
          '-Xep:EqualsGetClass:OFF',
          // 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',
      )
    }
  }
}
