/*
 * 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) {
  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('./deploy.sh')
}

