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