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

// Add "help" tasks which display plain text files under 'help' folder.

configure(rootProject) {
  def helpFiles = [
      ["Workflow", "help/workflow.txt", "Typical workflow commands."],
      ["Ant", "help/ant.txt", "Ant-gradle migration help."],
      ["Tests", "help/tests.txt", "Tests, filtering, beasting, etc."],
      ["Formatting", "help/formatting.txt", "Code formatting conventions."],
      ["Jvms", "help/jvms.txt", "Using alternative or EA JVM toolchains."],
      ["Deps", "help/dependencies.txt", "Declaring, inspecting and excluding dependencies."],
      ["ForbiddenApis", "help/forbiddenApis.txt", "How to add/apply rules for forbidden APIs."],
      ["LocalSettings", "help/localSettings.txt", "Local settings, overrides and build performance tweaks."],
      ["Git", "help/git.txt", "Git assistance and guides."],
      ["ValidateLogCalls", "help/validateLogCalls.txt", "How to use logging calls efficiently."],
      ["IDEs", "help/IDEs.txt", "IDE support."],
      ["GpgSigning", "help/gpgSigning.txt", "Signing artifacts with GPG."],
      ["Docker", "solr/docker/gradle-help.txt", "Building Solr Docker images."],
  ]

  helpFiles.each { section, path, sectionInfo ->
    task "help${section}" {
      group = 'Help (developer guides and hints)'
      description = sectionInfo
      doFirst {
        println "\n" + rootProject.file(path).getText("UTF-8")
      }
    }
  }

  help {
    doLast {
      println ""
      println "This is an experimental Lucene/Solr gradle build. See some"
      println "guidelines, ant-equivalent commands etc. under help/*; or type:"
      println ""
      helpFiles.each { section, path, sectionInfo ->
        println String.format(Locale.ROOT,
            "  gradlew :help%-16s # %s", section, sectionInfo)
      }
      println ""
      println "For the impatient, build the project with 'gradlew assemble' or 'gradlew dev' "
    }
  }

  task allHelpFilesExit() {
    doFirst {
      helpFiles.each { section, path, sectionInfo ->
        if (!rootProject.file(path).exists()) {
          throw new GradleException("Help file missing: ${path} (correct help.gradle)")
        }
      }
    }
  }

  check.dependsOn allHelpFilesExit
}
