/*
 * 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."],
      ["Eclipse", "help/eclipse.txt", "Eclipse IDE workflow 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:"
      helpFiles.each { section, path, sectionInfo ->
        println String.format(Locale.ROOT,
            "  gradlew :help%-16s # %s", section, sectionInfo)
      }
    }
  }

  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
}
