/*
 *  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.
 */
import org.apache.tools.ant.filters.ReplaceTokens

plugins {
    id 'org.apache.groovy-distribution'
    id 'org.apache.groovy-published-library'
    id 'org.apache.groovy-asciidoctor'
}

docAggregation {
    excludeFromJavadoc '**/*.html',
            '**/*.groovy',
            '*.g4',
            '**/GroovyRecognizer.java', // generated file
            '**/*.tokens', // Antlr generated file
            '**/*.interp' // Antlr generated file
}

tasks.named('asciidoctor') {
    attributes reldir_root: '.',
            reldir_jmx: '.',
            reldir_swing: '.',
            reldir_console: '.'
}

distribution {
    docs ':', 'org.codehaus.groovy.runtime.ArrayGroovyMethods',
            'org.codehaus.groovy.runtime.DefaultGroovyMethods',
            'org.codehaus.groovy.runtime.DefaultGroovyStaticMethods',
            'org.codehaus.groovy.runtime.EncodingGroovyMethods',
            'org.codehaus.groovy.runtime.IOGroovyMethods',
            'org.codehaus.groovy.runtime.ProcessGroovyMethods',
            'org.codehaus.groovy.runtime.ResourceGroovyMethods',
            'org.codehaus.groovy.runtime.SocketGroovyMethods',
            'org.codehaus.groovy.runtime.StreamGroovyMethods',
            'org.codehaus.groovy.runtime.StringGroovyMethods',
            'org.codehaus.groovy.vmplugin.v8.PluginDefaultGroovyMethods',
            'org.codehaus.groovy.vmplugin.v9.PluginDefaultGroovyMethods',
            'org.codehaus.groovy.vmplugin.v10.PluginDefaultGroovyMethods'
    docs ':groovy-dateutil', 'org.apache.groovy.dateutil.extensions.DateUtilExtensions'
    docs ':groovy-datetime', 'org.apache.groovy.datetime.extensions.DateTimeExtensions',
            'org.apache.groovy.datetime.extensions.DateTimeStaticExtensions'
    docs ':groovy-sql', 'org.apache.groovy.sql.extensions.SqlExtensions'
    docs ':groovy-swing', 'org.apache.groovy.swing.extensions.SwingExtensions'
    docs ':groovy-xml', 'org.apache.groovy.xml.extensions.XmlExtensions'
    docs ':groovy-nio', 'org.apache.groovy.nio.extensions.NioExtensions'
    docs ':groovy-jsr223', 'org.codehaus.groovy.jsr223.ScriptExtensions',
            'org.codehaus.groovy.jsr223.ScriptStaticExtensions'

    distSpec = copySpec {
        from rootProject.file("licenses/LICENSE-BINZIP")
        from rootProject.file("notices/NOTICE-BINZIP")
        rename '^([A-Z]+)-([^.]*)', '$1'
        into('lib') {
            from(configurations.distributionsRuntimeClasspath) {
                exclude {
                    it.file.name.contains('activation') ||
                            it.file.name.contains('livetribe-jsr223') ||
                            it.file.name.startsWith('openbeans-') ||
                            it.file.name.startsWith('asm-') ||
                            it.file.name.startsWith('antlr4-') ||
                            it.file.name.startsWith('picocli-')
                }
            }
            from rootProject.file('src/bin/groovy.icns')
        }
        rootProject.allprojects {
            pluginManager.withPlugin('org.apache.groovy-base') {
                if (groovyLibrary.hasGrooid()) {
                    into('grooid') {
                        from tasks.named('grooidJar')
                    }
                }
            }
        }
        into('conf') {
            from rootProject.file('src/conf')
        }
        into('bin') {
            from(rootProject.file('src/bin')) {
                filter(ReplaceTokens, tokens: [GROOVYJAR: "groovy-${versions.groovy}.jar".toString()])
                fileMode = 0755
                exclude 'groovy.icns'
            }
            from projects.groovyDocgenerator.dependencyProject.file('src/main/resources/org/apache/groovy/docgenerator/groovy.ico')
        }
        into('licenses') {
            from rootProject.file('licenses')
            include 'antlr4-license.txt'
            include 'asm-license.txt'
            include 'hamcrest-license.txt'
            include 'jline2-license.txt'
            include 'jsr166y-license.txt'
            include 'jsr223-license.txt'
            include 'junit4-license.txt'
            include 'junit5-license.txt'
            include 'xstream-license.txt'
        }
    }

    docSpec = copySpec {
        into('html/api') {
            from tasks.named('javadocAll')
        }
        into('html/gapi') {
            from tasks.named('groovydocAll')
        }
        into('html/documentation') {
            from configurations.allAsciidoc
            from tasks.named('asciidoctor')
            from tasks.named('asciidoctorPdf')
            exclude '.asciidoctor'
        }
        into('html/groovy-jdk') {
            from tasks.named('docGDK')
        }
        into('licenses') {
            from rootProject.file('licenses')
            include 'asciidoc-style-license.txt'
            include 'jquery-js-license.txt'
            include 'normalize-stylesheet-license.txt'
        }
        from rootProject.file("licenses/LICENSE-DOC")
        from rootProject.file("notices/NOTICE-BASE")
        rename 'LICENSE-DOC', 'LICENSE'
        rename 'NOTICE-BASE', 'NOTICE'
    }

    srcSpec = copySpec {
        rootProject.subprojects {
            into("subprojects/${project.projectDir.name}") {
                from(project.projectDir) {
                    exclude 'build',
                            'target',
                            'out',             // used by Intellij IDEA
                            '**/*.iml',        // used by Intellij IDEA
                            '**/*.ipr',        // used by Intellij IDEA
                            '**/*.iws',        // used by Intellij IDEA
                            '.settings',       // used by Eclipse
                            '.classpath',      // used by Eclipse
                            '.gradle'          // used by Gradle
                }
            }
        }
        ['xdocs',
         'config',
         'build-logic',
         'licenses',
         'notices',
         'security',
         'gradle',
         'src',
         'bootstrap',
         'build.gradle',
         'settings.gradle',
         'versions.properties',
         'gradle.properties',
         'LICENSE',
         'NOTICE',
         'README.adoc'].each {
            def file = rootProject.file(it)
            from(file) {
                if (file.directory) {
                    into file.name
                    exclude 'build',
                            'target',
                            'wrapper',        // used by Gradle
                            '**/*.iml',       // used by Intellij IDEA
                            '**/*.ipr',       // used by Intellij IDEA
                            '**/*.iws',       // used by Intellij IDEA
                            '.settings',      // used by Eclipse
                            '.classpath',     // used by Eclipse
                            '.gradle',        // used by Gradle
                            '*.gpg'           // used by Gradle
                }
            }
        }
    }
}

tasks.withType(AbstractArchiveTask).configureEach {
    preserveFileTimestamps = false
    reproducibleFileOrder = true
}
