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


// When a custom step changes, we need to bump the value passed to the method
//   bumpThisNumberIfACustomStepChanges
// This has been historically easy to forget, however, and can cause failures in some rare cases.
// To safeguard against this, we instead use the (partial) md5 of this file as that method input.
def thisFile = file("${rootDir}/${scriptDir}/spotless.gradle")
def thisFileMd5 = thisFile.text.md5() as String
def thisFileMd5Piece = thisFileMd5.substring(0, 8)
def thisFileIntegerHash = Integer.parseUnsignedInt(thisFileMd5Piece, 16)
logger.debug("Using partial md5 (${thisFileIntegerHash}) of file ${thisFile} as spotless bump.")

project.ext.set("spotless-file-hash", thisFileIntegerHash)


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

    // 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(project.ext.'spotless-file-hash')

    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.")
      }
    }
    custom 'Refuse Awaitility import', {
      if (it =~ /import\s+(static\s+)?org.awaitility.Awaitility.*/) {
        throw new AssertionError("Do not use Awaitility.await(). Use GeodeAwaitility.await() instead. 'spotlessApply' cannot resolve this issue.")
      }
    }
    importOrderFile "${rootDir}/${scriptDir}/../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.

    // The format file is relative to geode-core and not the root project as the root project would change
    // if Geode and submodules are included as part of a different gradle project.
    eclipse('4.6.3').configFile "${rootDir}/${scriptDir}/../etc/eclipse-java-google-style.xml"
    trimTrailingWhitespace()
    endWithNewline()
  }


  groovyGradle {
    target project.fileTree(project.projectDir) {
      include '**/*.gradle'
      exclude '**/generated-src/**'
      exclude '**/build/**'
    }

    // 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(project.ext.'spotless-file-hash')

    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(')
    }

    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)

  // Within the configure block, 'project' refers to the task-owning project, in this case rootProject
  def thisProjectScoped = project
  rootProject.tasks.named('devBuild').configure {
    dependsOn thisProjectScoped.tasks.named('spotlessApply')
  }
}
