/*
 * 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."],
      ["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."],
  ]

  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
}
