/*
 * 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.
 */
plugins {
    id 'java'
    id 'distribution'
    id "com.github.vlsi.stage-vote-release"
}

description = 'Apache BookKeeper :: Dist (Server)'

releaseArtifacts {
    artifact(tasks.named("distTar"))
}

//    implementation project(':bookkeeper-http:vertx-http-server')
dependencies {

    implementation project(':bookkeeper-http:http-server')
    implementation project(':bookkeeper-server')
    implementation project(':bookkeeper-stats-providers:prometheus-metrics-provider')
    implementation project(':bookkeeper-stats')
    implementation project(':stream:distributedlog:core')
    implementation project(':stream:server')
    implementation project(':bookkeeper-tools')

    compileOnly depLibs.lombok
    compileOnly depLibs.spotbugsAnnotations

    implementation depLibs.slf4jLog4j


    testCompileOnly depLibs.lombok


    annotationProcessor depLibs.lombok
    testAnnotationProcessor depLibs.lombok
}

jar {
    archiveBaseName = 'bookkeeper-dist-server'
}

def depLicences = [
        "checker-qual-3.5.0/LICENSE",
        "google-auth-library-credentials-0.20.0/LICENSE",
        "javax.servlet-api-4.0.0/CDDL+GPL-1.1",
        "netty-4.1.50.Final/*",
        "bouncycastle-1.0.2/LICENSE.html",
        "protobuf-3.14.0/LICENSE",
        "protobuf-3.12.0/LICENSE",
        "slf4j-1.7.25/LICENSE.txt",
]
distributions {
    main {
        def distname = "bookkeeper-server-${buildVersion}"
        distributionBaseName = "${distname}"
        contents {
            into("/${distname}/conf") {
                from("../../conf")
            }
            into("/${distname}/bin") {
                fileMode = 0755
                from("../../bin")
            }
            into("/${distname}/deps") {
                from("../src/main/resources/deps/") {
                    include depLicences
                }
            }
            into("/${distname}/") {
                fileMode = 0644
                from("../../README.md")
                from("../src/main/resources/") {
                    include "*-server.bin.txt"
                    rename "(.*)-server.bin.txt", '$1'
                }
            }
            into("/${distname}/lib").with {
                configurations.runtimeClasspath.resolvedConfiguration.resolvedArtifacts.each {
                    dep ->
                        from(dep.file) {
                            String archiveName;
                            if (dep.id.componentIdentifier.hasProperty("projectName")) {
                                def p = project.findProject("${dep.id.componentIdentifier.projectPath}")
                                p.publishing.publications.matching({
                                    it.artifactId == dep.name
                                }).each { pub ->
                                    archiveName = "${pub.groupId}-${pub.artifactId}-${pub.version}.jar"
                                }
                            } else {
                                // External dependencies
                                def id = dep.moduleVersion.id
                                archiveName = "${id.group}-${id.name}-${id.version}.jar"
                            }
                            rename {archiveName}
                        }
                }
                from jar
            }
        }
    }
}
