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


task aggregateJavadoc(type: Javadoc) {
  project.rootProject.version = getJavadocVersion()

  dependsOn subprojects.javadoc
  source subprojects.javadoc.source
  destinationDir project.rootProject.file("site/docs/javadoc/${getJavadocVersion()}")
  classpath = project.rootProject.files(subprojects.javadoc.classpath)

  final JAVADOC_FIX_SEARCH_STR = '\n\n' +
          'getURLPrefix = function(ui) {\n' +
          '    return \'\';\n' +
          '};\n'

  doLast {
    // Fix bug with search
    if (JavaVersion.current() >= JavaVersion.VERSION_11) {
      // Append the fix to the file
      def searchScript = new File("site/docs/javadoc/${getJavadocVersion()}" + '/search.js')
      searchScript.append JAVADOC_FIX_SEARCH_STR
    }
  }
}

task removeJavadoc(type: Exec) {
  commandLine 'rm', '-rf', "site/docs/javadoc/${getJavadocVersion()}"
}

task refreshJavadoc(type: Exec) {
  dependsOn aggregateJavadoc
  dependsOn removeJavadoc
  aggregateJavadoc.mustRunAfter removeJavadoc
  commandLine 'git', 'add', "site/docs/javadoc/${getJavadocVersion()}"
}

task deploySite(type: Exec) {
  workingDir 'site'
  commandLine 'mkdocs', 'gh-deploy'
}

