/*
 * 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.
 */
buildscript {
    repositories {
        mavenCentral()
    }
}

plugins {
    id 'com.google.protobuf'
    id 'java'
    id "com.github.vlsi.stage-vote-release" version "1.73"
    id 'checkstyle'
    id 'org.nosphere.apache.rat'
}

subprojects {
    task allDeps(type: DependencyReportTask) {}
}

apply from: "$rootDir/version.gradle"
version = buildVersion

releaseArtifacts {
    fromProject("bookkeeper-dist")
    fromProject("bookkeeper-dist-all")
    fromProject("bookkeeper-dist-bkctl")
    fromProject("bookkeeper-dist-server")
}

releaseParams { // ReleaseExtension
    tlp.set("Bookkeeper")
    componentName.set("Apache Bookkeeper")
    releaseTag.set("release-$buildVersion")
    rcTag.set(rc.map { "release-$buildVersion-rc$it" })

    sitePreviewEnabled.set(false)

    nexus {
        packageGroup.set("org.apache.bookkeeper")
    }
}

allprojects {
    apply from: "$rootDir/dependencies.gradle"
    if (it.path != ':circe-checksum:src:main:circe'
        && it.path != ':cpu-affinity:src:main:affinity'
        && it.name != 'src'
        && it.name != 'main') {
        apply plugin: 'java'
        apply plugin: 'maven-publish'
        apply plugin: 'signing'
        apply plugin: 'org.nosphere.apache.rat'
        apply plugin: "checkstyle"
        checkstyle {
            toolVersion "${checkStyleVersion}"
            configFile file("$rootDir/buildtools/src/main/resources/bookkeeper/checkstyle.xml")
            checkstyleMain {
                source ='src/main/java'
            }

            checkstyleTest {
                source ='src/test/java'
            }
        }

        task testJar(type: Jar, dependsOn: testClasses) {
            classifier = 'tests'
            from sourceSets.test.output
        }

        // TODO- Seperate rat plugins and other plugins configuration in seperate files
        rat {
            excludes = [
                    '**/.*/**',
                    '**/*.ipr',
                    '**/out/**',
                    '**/generated/**',
                    '**/build/**',
                    '**/.idea/**',
                    '.git/**/*',
                    '.github/**/*',
                    '**/.gitignore',
                    '**/.svn/**/*',
                    '**/target/**/*',
                    '**/README.md',
                    '**/README.rst',
                    '**/apidocs/*',
                    '**/src/main/resources/deps/**',
                    '**/META-INF/**',
                    '**/.classpath',
                    '**/.project',
                    '**/.checkstyle',
                    '**/.settings/*',
                    '**/*.iml',
                    '**/*.iws',
                    '**/*.ipr',
                    'site/**',
                    'site2/**',
                    '**/*.log',
                    'data/**',
                    'dev/.vagrant/**',
                    '**/proto/**.py',
                    '**/keyStoreClientPassword.txt',
                    '**/keyStoreServerPassword.txt',
                    '**/proc_cpuinfo.txt',
                    '**/__pycache__/**',
                    '**/bookkeeper.egg-info/**',
                    '**/apache_bookkeeper_client.egg-info/**',
                    '**/pip-selfcheck.json',
                    '**/test_conf_2.conf'
            ]
        }

        configurations {
            testArtifacts.extendsFrom testRuntime
        }

        artifacts {
            testArtifacts testJar
        }

        plugins.withType(DistributionPlugin) {
            distTar {
                compression = Compression.GZIP
                archiveExtension = 'tar.gz'
            }
        }

        javadoc {
            options.addBooleanOption('Xdoclint:none', true)
            includes = [
                    '**/org/apache/bookkeeper/client/api/**',
                    '**/org/apache/bookkeeper/common/annotation/**',
                    '**/org/apache/bookkeeper/conf/**',
                    '**/org/apache/bookkeeper/feature/**',
                    '**/org/apache/bookkeeper/stats/**',
            ]
        }

        def componentName = it.name
        publishing {
            publications {
                maven(MavenPublication) {
                    groupId = 'org.apache.bookkeeper'
                    artifactId = componentName
                    version = buildVersion

                    from components.java
                }
            }
        }
        signing {
            def skipSigning = project.hasProperty('skipSigning') && skipSigning.toBoolean()
            def shouldSign = !skipSigning

            if (shouldSign) {
                if (project.hasProperty("singingKey")) {
                    // The following allow the secretKey and password to be specified using env var
                    // This is mainly for the CI system.
                    //   * ORG_GRADLE_PROJECT_signingKey
                    //   * ORG_GRADLE_PROJECT_signingPassword
                    //   * ORG_GRADLE_PROJECT_signingKeyId
                    // See https://docs.gradle.org/current/userguide/signing_plugin.html#sec:in-memory-keys
                    // for details
                    def signingKey = findProperty("signingKey")
                    def signingKeyId = findProperty("signingKeyId")
                    def signingPassword = findProperty("signingPassword")
                    if (signingKeyId && signingKey && signingPassword) {
                        useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword)
                    } else if (signingKey && signingPassword) {
                        useInMemoryPgpKeys(signingKey, signingPassword)
                    }
                }
                // Signing task is added by the release plugin
            }
        }
        test {
            testLogging {
                events "skipped", "failed", "standardError"
            }

            String testGroup = System.properties['testGroup']
            if (testGroup == 'client') {
                include '**/client/*'
            } else if (testGroup == 'bookie') {
                include '**/bookie/*'
            } else if (testGroup == 'other') {
                exclude '**/client/*'
                exclude '**/bookie/*'
            }
            if (project.hasProperty('excludeTests')) {
                exclude project.property('excludeTests')
            }
        }
    }

    repositories {
        mavenCentral()
    }

}

pluginManager.withPlugin('java') {
    sourceCompatibility = targetCompatibility = 8
}
