/*
 * 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.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"
      indentWithSpaces(2)
    }
    groovy {
      target project.fileTree(project.projectDir) {
        include 'src/**/*.groovy'
        include 'buildSrc/**/*.groovy'
      }
      greclipse().configFile "${rootProject.projectDir}/etc/greclipse.properties"
      indentWithSpaces(2)
    }
  }

  // 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)
  }
}