/*
 * fdb-record-layer-core-shaded.gradle
 *
 * This source file is part of the FoundationDB open source project
 *
 * Copyright 2015-2018 Apple Inc. and the FoundationDB project authors
 *
 * 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.
 */

plugins {
    alias(libs.plugins.shadow)
}

def coreProject = ":${ext.coreProjectName}"

dependencies {
  implementation project(coreProject)
}

shadowJar {
    setArchiveClassifier(null)
    relocate 'com.google', 'com.apple.foundationdb.record.shaded.com.google'
    dependencies {
        // Exclude transitive information from the guava dependency to avoid
        // confusing tooling inspecting the jar
        exclude "META-INF/maven/**"

        include(dependency(coreProject))
        include(dependency(':fdb-extensions'))
        include(dependency('com.google.guava:guava'))
        include(dependency('com.google.protobuf:protobuf-java'))
    }
}

build.dependsOn {
    shadowJar
}

createDistribution {dependsOn('shadowJar')}

task shadedSourcesJar(type: Jar) {
    description = "Assembles a Jar archive containing the main sources."
    group = JavaBasePlugin.DOCUMENTATION_GROUP
    archiveAppendix = null
    archiveClassifier = "sources"
    from project(coreProject).sourceSets.main.allSource
    from project(':fdb-extensions').sourceSets.main.allSource
    dependsOn(project(coreProject).tasks.generateProto)
    dependsOn(project(coreProject).tasks.compileJava)
}

task shadedJavadocJar(type: Jar) {
    description = "Assembles a Jar archive containing the main Javadoc."
    group = JavaBasePlugin.DOCUMENTATION_GROUP
    archiveAppendix = null
    archiveClassifier = "javadoc"
    from project(coreProject).tasks.javadoc
}

ext.shadedDependencyConfigs = ['api', 'implementation']
ext.shadedDependencyNames = ['guava', 'protobuf-java', 'fdb-extensions']

def addDependencies(projectObj, dependenciesNode) {
    shadedDependencyConfigs.forEach { config ->
        projectObj.configurations[config].getDependencies().forEach { dep ->
            if (!shadedDependencyNames.contains(dep.name)) {
                def dependencyNode = dependenciesNode.appendNode('dependency')
                dependencyNode.appendNode('groupId', dep.group)
                dependencyNode.appendNode('artifactId', dep.name)
                dependencyNode.appendNode('version', dep.version)
                dependencyNode.appendNode('scope', config)
            }
        }
    }
}

ext.publishLibrary = false

apply from: rootProject.file('gradle/publishing.gradle')

publishing {
    publications {
        shadow(MavenPublication) { publication ->
            from components.shadow
            addPublishingInfo(publication) // function imported from publishing.gradle
            publication.pom { pom ->
                description = 'A record-oriented layer built for FoundationDB (shaded artifacts).'
                pom.withXml { xml ->
                    // Remove any existing dependencies sections
                    def childNodes = xml.asNode().children()
                    def dependenciesNodes = new ArrayList<groovy.util.Node>()
                    childNodes.forEach { childNode ->
                        if (childNode.name().equals('dependencies')) {
                            dependenciesNodes.add(childNode)
                        }
                    }
                    dependenciesNodes.forEach {
                        xml.asNode().remove(it)
                    }
                    // Add a section containing all non-shaded dependencies
                    def dependenciesNode = xml.asNode().appendNode('dependencies')
                    addDependencies(project(coreProject), dependenciesNode)
                    addDependencies(project(':fdb-extensions'), dependenciesNode)
                }
            }
            artifact tasks.shadedSourcesJar
            artifact tasks.shadedJavadocJar
        }

    }
}

if (Boolean.parseBoolean(centralPublish)) {
    signing {
        sign publishing.publications.shadow
    }
}
