/*
 *  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 doc(dependsOn: ['javadocAll', 'groovydocAll', 'docGDK', 'asciidocAll']) {
    ext.footer = 'Copyright &copy; 2003-2020 The Apache Software Foundation. All rights reserved.'
    ext.title = "Groovy ${groovyVersion}"
}

task asciidocAll(type: Copy) {
    allprojects {
        dependsOn asciidoctor
        from asciidoctor.outputDir
    }
    into "$buildDir/asciidocAll"
}

def javadocSpec = {
    maxMemory = javaDoc_mx
    project.configure(options) {
        if (JavaVersion.current().isJava9Compatible()) {
            options.addBooleanOption('html5', true)
        }
        windowTitle = doc.title
        docTitle = doc.title
        classpath += project.file('src/main/java')
        locale = 'en_US'
        encoding = 'UTF-8'
        version = true
        overview = rootProject.file('src/main/java/overviewj.html')
        footer = doc.footer
        source = '1.8'
        links('https://docs.oracle.com/javase/8/docs/api/', 'https://docs.oracle.com/javaee/7/api/',
                'https://commons.apache.org/proper/commons-cli/javadocs/api-release/', 'https://junit.org/junit4/javadoc/latest/',
                'https://docs.oracle.com/javaee/6/api/')
    }
}

def groovydocBaseSpec = {
    use = true
    ext.windowtitle = doc.title
    ext.doctitle = doc.title
    header = doc.title
    footer = doc.footer
    overviewText = rootProject.resources.text.fromFile('src/main/java/overview.html')
    includePrivate = false
    link 'https://docs.oracle.com/javaee/7/api/', 'javax.servlet.', 'javax.management.'
    link 'https://docs.oracle.com/javase/8/docs/api/', 'java.', 'org.xml.', 'javax.', 'org.w3c.'
    link 'https://docs.groovy-lang.org/docs/ant/api/', 'org.apache.ant.', 'org.apache.tools.ant.'
    link 'https://junit.org/junit4/javadoc/latest/', 'org.junit.', 'junit.'
    link 'https://junit.org/junit5/docs/current/api/', 'org.junit.jupiter.', 'org.junit.platform.'
    link 'https://www.antlr.org/api/Java/', 'org.antlr.v4.'
    link 'https://commons.apache.org/proper/commons-cli/javadocs/api-release/', 'org.apache.commons.cli.'
    link 'https://picocli.info/apidocs/', 'picocli.'
}

def groovydocSpec = groovydocBaseSpec >> {
    source = project.sourceSets.main.allSource
    classpath = javadoc.classpath
}

allprojects {
    javadoc javadocSpec
    groovydoc groovydocSpec
}

javadoc {
    exclude '**/GroovyRecognizer.java' // generated file
}

evaluationDependsOn('groovy-jaxb')

// Root project has an extra 'all' javadoc task
task javadocAll(type: Javadoc)
javadocAll {
    destinationDir = new File(buildDir, 'alljavadoc')
    source = javadoc.source
    classpath = javadoc.classpath
    subprojects.each { sp ->
        source += sp.javadoc.source
        classpath += sp.javadoc.classpath
    }
    exclude '**/GroovyRecognizer.java' // generated file
}
javadocAll javadocSpec

// Root project has an extra 'all' groovydoc task
task groovydocAll(type: Groovydoc)
groovydocAll {
    dependsOn( { project(':groovy-groovydoc').classes })
    dependsOn( { project(':groovy-docgenerator').classes })
    destinationDir = new File(buildDir, 'allgroovydoc')
    source = groovydoc.source
    classpath = groovydoc.classpath
    groovyClasspath = groovydoc.groovyClasspath
    subprojects.each { sp ->
        source += sp.groovydoc.source
        classpath += sp.groovydoc.classpath
        groovyClasspath += sp.groovydoc.groovyClasspath
    }
}
groovydocAll groovydocBaseSpec

// when docgenerator is run by the build, it requires a groovy-release-info file
// but the file is only generated by the 'jar' task, so as a workaround, we copy
// it into the docgenerator classes
task docProjectVersionInfo(type: Copy) {
    destinationDir = file("${buildDir}/docgenerator-resources")
    into('META-INF') {
        from(generateReleaseInfo)
    }
    from('subprojects/groovy-docgenerator/src/main/resources')
}

task docGDK {
    outputs.cacheIf { true }
    dependsOn([project(':groovy-groovydoc'), project(':groovy-docgenerator')]*.classes)
    dependsOn docProjectVersionInfo
    ext.destinationDir = "$buildDir/html/groovy-jdk"
    inputs.files sourceSets.main.runtimeClasspath + configurations.tools + files(docProjectVersionInfo.destinationDir)
    outputs.dir destinationDir
    def docGeneratorPath = files(project(':groovy-docgenerator').sourceSets.main.output.classesDirs)
    doLast { task ->
        try {
            ant {
                java(classname: 'org.apache.groovy.docgenerator.DocGenerator',
                     fork: 'true',
                     failonerror: 'true',
                     classpath: (sourceSets.main.runtimeClasspath + rootProject.files(docProjectVersionInfo.destinationDir) + configurations.tools + groovydocAll.groovyClasspath + docGeneratorPath).asPath,
                     errorproperty: 'edr',
                     outputproperty: 'odr') {
                    arg(value: '-title')
                    arg(value: 'Groovy JDK enhancements')
                    arg(value: '-link')
                    arg(value: 'groovy,org.codehaus.groovy=https://docs.groovy-lang.org/latest/html/gapi/')
                    arg(value: '-link')
                    arg(value: 'java,org.xml,javax,org.w3c=https://docs.oracle.com/javase/8/docs/api/')
                    // either package name if in core or fully qualified path otherwise
                    arg(value: 'org.codehaus.groovy.runtime.DefaultGroovyMethods')
                    arg(value: 'org.codehaus.groovy.runtime.DefaultGroovyStaticMethods')
                    arg(value: 'org.codehaus.groovy.runtime.EncodingGroovyMethods')
                    arg(value: 'org.codehaus.groovy.runtime.IOGroovyMethods')
                    arg(value: 'org.codehaus.groovy.runtime.ProcessGroovyMethods')
                    arg(value: 'org.codehaus.groovy.runtime.ResourceGroovyMethods')
                    arg(value: 'org.codehaus.groovy.runtime.SocketGroovyMethods')
                    arg(value: 'org.codehaus.groovy.runtime.StringGroovyMethods')
                    arg(value: 'org.codehaus.groovy.vmplugin.v8.PluginDefaultGroovyMethods')
                    arg(value: 'org.codehaus.groovy.vmplugin.v9.PluginDefaultGroovyMethods')
                    // TODO don't hard-code these
                    arg(value: 'subprojects/groovy-dateutil/src/main/java/org/apache/groovy/dateutil/extensions/DateUtilExtensions.java')
                    arg(value: 'subprojects/groovy-datetime/src/main/java/org/apache/groovy/datetime/extensions/DateTimeExtensions.java')
                    arg(value: 'subprojects/groovy-datetime/src/main/java/org/apache/groovy/datetime/extensions/DateTimeStaticExtensions.java')
                    arg(value: 'subprojects/groovy-jaxb/src/main/groovy/org/apache/groovy/jaxb/extensions/JaxbExtensions.java')
                    arg(value: 'subprojects/groovy-sql/src/main/java/org/apache/groovy/sql/extensions/SqlExtensions.java')
                    arg(value: 'subprojects/groovy-swing/src/main/java/org/apache/groovy/swing/extensions/SwingExtensions.java')
                    arg(value: 'subprojects/groovy-xml/src/main/java/org/apache/groovy/xml/extensions/XmlExtensions.java')
                    arg(value: 'subprojects/groovy-nio/src/main/java/org/apache/groovy/nio/extensions/NioExtensions.java')
                    arg(value: 'subprojects/groovy-jsr223/src/main/java/org/codehaus/groovy/jsr223/ScriptExtensions.java')
                    arg(value: 'subprojects/groovy-jsr223/src/main/java/org/codehaus/groovy/jsr223/ScriptStaticExtensions.java')
                }
            }
        } finally {
            if (ant.properties.odr) {
                logger.info 'Out: ' + ant.properties.odr
            }
            if (ant.properties.edr) {
                logger.error 'Err: ' + ant.properties.edr
            }
        }
        copy {
            into task.destinationDir
            from 'subprojects/groovy-docgenerator/src/main/resources/org/apache/groovy/docgenerator/groovy.ico',
                    'subprojects/groovy-docgenerator/src/main/resources/org/apache/groovy/docgenerator/stylesheet.css'
        }
    }
}

javadocAll.options.source = '1.8'

allprojects {
    tasks.withType(Javadoc) {
        // disable the crazy super-strict doclint tool in Java 8
        options.addStringOption('Xdoclint:none', '-quiet')
    }
}
