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

allprojects {
  apply plugin: "com.diffplug.gradle.spotless"
  spotless {
    lineEndings = 'unix'
    java {
      target project.fileTree(project.projectDir) {
        include 'src/**/*.java'
        include 'buildSrc/**/*.java'
      }


      // As the method name suggests, bump this number if any of the below "custom" rules change.
      // Spotless will not run on unchanged files unless this number changes.
      bumpThisNumberIfACustomStepChanges(0)

      removeUnusedImports()

      custom 'Remove commented-out import statements', {
        it.replaceAll(/\n\/\/ import .*?;.*/, '')
      }
      custom 'Refuse wildcard imports', {
        // Wildcard imports can't be resolved by spotless itself.
        // This will require the developer themselves to adhere to best practices.
        if (it =~ /\nimport .*\*;/) {
          throw new AssertionError("Do not use wildcard imports.  'spotlessApply' cannot resolve this issue.")
        }
      }

      importOrderFile "${rootProject.projectDir}/etc/eclipseOrganizeImports.importorder"

      custom 'Remove unhelpful javadoc stubs', {
        // e.g., remove the following lines:
        // "* @param paramName"
        // "* @throws ExceptionType"
        // "* @return returnType"'
        // Multiline to allow anchors on newlines
        it.replaceAll(/(?m)^ *\* *@(?:param|throws|return) *\w* *\n/, '')
      }
      custom 'Remove any empty Javadocs and block comments', {
        // Matches any /** [...] */ or /* [...] */ that contains:
        // (a) only whitespace
        // (b) trivial information, such as "@param paramName" or @throws ExceptionType
        //     without any additional information.  This information is implicit in the signature.
        it.replaceAll(/\/\*+\s*\n(\s*\*\s*\n)*\s*\*+\/\s*\n/, '')
      }

      // Enforce style modifier order
      custom 'Modifier ordering', {
        def modifierRanking = [
          "public"      : 1,
          "protected"   : 2,
          "private"     : 3,
          "abstract"    : 4,
          "default"     : 5,
          "static"      : 6,
          "final"       : 7,
          "transient"   : 8,
          "volatile"    : 9,
          "synchronized": 10,
          "native"      : 11,
          "strictfp"    : 12]
        // Find any instance of multiple modifiers. Lead with a non-word character to avoid
        // accidental matching against for instance, "an alternative default value"
        it.replaceAll(/\W(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, {
          // Do not replace the leading non-word character.  Identify the modifiers
          it.replaceAll(/(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, {
            // Sort the modifiers according to the ranking above
            it.split().sort({ modifierRanking[it] }).join(' ') + ' '
          }
          )
        }
        )
      }


      // Notes on eclipse formatter version:
      // 4.6.3 is consistent with existing / previous behavior.
      // 4.7.1 works, but had different default whitespace rules, notably with mid-ternary linebreak.
      // 4.7.2 exists but is currently incompatible with our style file, raising NPEs.

      eclipse('4.6.3').configFile "${rootProject.projectDir}/etc/eclipse-java-google-style.xml"
      trimTrailingWhitespace()
      endWithNewline()
    }
    groovyGradle {
      target project.fileTree(project.projectDir) {
        include '*.gradle'
        include 'buildSrc/*.gradle'
        include 'gradle/*.gradle'
      }

      // As the method name suggests, bump this number if any of the below "custom" rules change.
      // Spotless will not run on unchanged files unless this number changes.
      bumpThisNumberIfACustomStepChanges(0)

      custom 'Use single-quote in project directives.', {
        it.replaceAll(/project\(":([^"]*)"\)/, 'project(\':$1\')')
      }

      custom 'Use parenthesis in single-line gradle dependency declarations.', {
        it.replaceAll(/\n(\s*\S*(?:[cC]ompile|[rR]untime)(?:Only)?) (?!\()([^{\n]*)\n/, { original, declaration, dep ->
          "\n${declaration}(${dep})\n"
        })
      }

      custom 'Do not pad spaces before parenthesis in gradle dependency declaration.', {
        it.replaceAll(/\n(\s*\S*(?:[cC]ompile|[rR]untime)(?:Only)?) +\(/, '\n$1(')
      }

      greclipse().configFile "${rootProject.projectDir}/etc/greclipse.properties"
      paddedCell()
      indentWithSpaces(2)
    }
    groovy {
      target project.fileTree(project.projectDir) {
        include 'src/**/*.groovy'
        include 'buildSrc/**/*.groovy'
      }
      greclipse().configFile "${rootProject.projectDir}/etc/greclipse.properties"
      indentWithSpaces(2)
      paddedCell()
    }
  }

  // If we add more languages to Spotless, add them to 'compileXYZ' trigger below
  afterEvaluate {
    // Not all projects are java projects. findByName could return null, so use the null-safe ?. operator
    project.tasks.findByName('compileJava')?.mustRunAfter(spotlessCheck)
    project.tasks.findByName('compileJava')?.mustRunAfter(spotlessApply)
  }
}