// Copyright (C) 2017 The Android Open Source Project
//
// Licensed 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.
apply from: "${buildscript.sourceFile.parentFile}/javadoc_util.gradle"

class CombinedJavadocPlugin implements Plugin<Project> {

  static final String TASK_NAME = "generateCombinedJavadoc"

  @Override
  void apply(Project project) {
    project.gradle.projectsEvaluated {
      Set<Project> libraryModules = getLibraryModules(project)
      if (!libraryModules.isEmpty()) {
        project.task(TASK_NAME, type: Javadoc) {
          description = "Generates combined Javadoc."
          title = "ExoPlayer library"
          source = libraryModules.generateJavadoc.source
          classpath = project.files([])
          destinationDir = project.file("$project.buildDir/docs/javadoc")
          options {
            links "https://developer.android.com/reference"
            encoding = "UTF-8"
          }
          exclude "**/BuildConfig.java"
          exclude "**/R.java"
          doFirst {
            libraryModules.each { libraryModule ->
              libraryModule.android.libraryVariants.all { variant ->
                def name = variant.buildType.name
                if (name == "release") {
                  classpath +=
                      libraryModule.project.files(
                          variant.javaCompileProvider.get().classpath.files,
                          libraryModule.project.android.getBootClasspath())
                }
              }
            }
          }
          doLast {
            libraryModules.each { libraryModule ->
              project.copy {
                from "${libraryModule.projectDir}/src/main/javadoc"
                into "${project.buildDir}/docs/javadoc"
              }
            }
            project.fixJavadoc()
          }
        }
      }
    }
  }

  // Returns Android library modules that declare a generateJavadoc task.
  private static Set<Project> getLibraryModules(Project project) {
    project.subprojects.findAll {
      it.plugins.findPlugin("com.android.library") &&
      it.tasks.findByName("generateJavadoc")
    }
  }

}

apply plugin: CombinedJavadocPlugin
