/**
 * 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.
 */
description = 'Fineract WAR'

apply plugin: 'war'
apply plugin: 'distribution'
apply plugin: 'signing'

war {
    archiveFileName = 'fineract-provider.war'
    from("$rootDir/licenses/binary/") {
        // notice the parens
        into "WEB-INF/licenses/binary/" // no leading slash
    }
    from("$rootDir/LICENSE_RELEASE") {
        // notice the parens
        into "WEB-INF/" // no leading slash
    }
    from("$rootDir/NOTICE_RELEASE") {
        // notice the parens
        into "WEB-INF/" // no leading slash
    }
    rename ('LICENSE_RELEASE', 'LICENSE')
    rename ('NOTICE_RELEASE', 'NOTICE')

    from("$rootDir/DISCLAIMER") {
        // notice the parens
        into "WEB-INF/" // no leading slash
    }
    enabled = true
    classifier = ''
}

dependencies {
    implementation project(':fineract-provider')
}

tasks.withType(Tar) {
    compression Compression.GZIP
    extension 'tar.gz'
}

distributions {
    binary {
        if(project.hasProperty("distVersion")) {
            distributionBaseName = "apache-fineract-$distVersion-binary"
        } else {
            distributionBaseName = "apache-fineract-binary"
        }
        contents {
            from ("$rootDir/fineract-client/build/libs/") {
                include 'fineract-client-*.jar'
            }
            from ("$rootDir/fineract-provider/build/libs/") {
                include 'fineract-provider-*.jar'
                exclude 'fineract-provider-*-plain.jar'
            }
            from war
            from("$rootDir/licenses/") {
                into "licenses/"
            }
            from "$rootDir/LICENSE_RELEASE"
            from "$rootDir/NOTICE_RELEASE"
            rename ('LICENSE_RELEASE', 'LICENSE')
            rename ('NOTICE_RELEASE', 'NOTICE')

            from "$rootDir/DISCLAIMER"
            from "$rootDir/README.md"
        }
    }
    src {
        if(project.hasProperty("distVersion")) {
            distributionBaseName = "apache-fineract-$distVersion-src"
        } else {
            distributionBaseName = "apache-fineract-src"
        }

        contents {
            from "$rootDir/"
            exclude '**/build' , '.git', '**/.gradle', '.github', '**/.settings', '**/.project', '**/.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent', '**/.externalToolbuilders', '.theia', '.gitpod.yml', '.travis.yml', 'LICENSE_RELEASE', 'NOTICE_RELEASE', '**/licenses', '*.class', '**/bin', '*.log', '.dockerignore', '**/gradle', '**/.gitkeep'
            rename ('LICENSE_SOURCE', 'LICENSE')
            rename ('NOTICE_SOURCE', 'NOTICE')
        }
    }
}

tasks.binaryDistZip.enabled false
tasks.srcDistZip.enabled false
tasks.binaryDistTar.dependsOn war
// tasks.srcDistTar.dependsOn prepareInputYaml

// create signatures and checksums only if project parameter "fineract.release" is provided on the command line
if( project.hasProperty("fineract.release") ) {
    signing {
        useGpgCmd()
        sign (binaryDistTar, srcDistTar)
    }
    tasks.withType(Tar) { task ->
        task.doLast {
            ant.checksum file: task.archivePath, algorithm: 'SHA-512', fileext: '.sha512'
        }
    }
    tasks.withType(Sign) { task ->
        task.doLast {
            task.getFilesToSign().each { f ->
                new ByteArrayOutputStream().withStream { os ->
                    def result = exec {
                        workingDir "$buildDir/distributions"
                        executable 'sh'
                        args '-c', "gpg --verify ${f}.asc"
                        standardOutput = os
                    }
                    if(result.exitValue==0) {
                        println '+++ GPG signature correct!'
                    } else {
                        println '--- GPG signature incorrect!'
                        throw new RuntimeException('--- GPG signature incorrect!')
                    }
                }
            }
        }
    }
}
