/*
 *  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.gradle.api.internal.artifacts.publish.DefaultPublishArtifact

ext.artifactoryUser = project.hasProperty('artifactoryUser') ? project.artifactoryUser : System.getenv('ARTIFACTORY_USER')
ext.artifactoryPassword = project.hasProperty('artifactoryPassword') ? project.artifactoryPassword : System.getenv('ARTIFACTORY_PASSWORD')

if (!artifactoryUser) {
    // try to read from properties
    def artifactoryFile = file('artifactory.properties')
    if (artifactoryFile.exists()) {
        def props = new Properties()
        props.load(artifactoryFile.newReader())
        ext.artifactoryUser = props.getProperty('artifactoryUser','')
        ext.artifactoryPassword = props.getProperty('artifactoryPassword','')
    }
}

logger.lifecycle "ArtifactoryUser user: $artifactoryUser"

allprojects {
    if (project == rootProject || rootProject.ext.modules().contains(project)) {
        apply plugin: 'com.jfrog.artifactory-upload'

        artifactory {
            contextUrl = project.hasProperty('artifactoryContext') ? project.artifactoryContext : 'https://oss.jfrog.org'
            resolve {
                repository {
                    repoKey = 'libs-release'
                }
            }
            publish {
                excludePatterns = [
//                        'org/codehaus/groovy/groovy/**',
//                        'org/codehaus/groovy/groovy-ant/**',
//                        'org/codehaus/groovy/groovy-backports-compat23/**',
//                        'org/codehaus/groovy/groovy-binary/**',
//                        'org/codehaus/groovy/groovy-bsf/**',
//                        'org/codehaus/groovy/groovy-console/**',
//                        'org/codehaus/groovy/groovy-docgenerator/**',
//                        'org/codehaus/groovy/groovy-groovydoc/**',
//                        'org/codehaus/groovy/groovy-groovysh/**',
//                        'org/codehaus/groovy/groovy-jmx/**',
//                        'org/codehaus/groovy/groovy-json/**',
//                        'org/codehaus/groovy/groovy-jsr223/**',
//                        'org/codehaus/groovy/groovy-macro/**',
//                        'org/codehaus/groovy/groovy-nio/**',
//                        'org/codehaus/groovy/groovy-servlet/**',
//                        'org/codehaus/groovy/groovy-sql/**',
//                        'org/codehaus/groovy/groovy-swing/**',
//                        'org/codehaus/groovy/groovy-templates/**',
//                        'org/codehaus/groovy/groovy-test/**',
//                        'org/codehaus/groovy/groovy-testng/**',
//                        'org/codehaus/groovy/groovy-xml/**',
                        'org/codehaus/groovy/groovy/*/groovy-all-*',
                        'org/codehaus/groovy/groovy/*/groovy-backports-*',
                        'org/codehaus/groovy/groovy/*/groovy-binary-*'
                ].join(',')
                repository {
                    repoKey = project.hasProperty('artifactoryRepoKey') ? project.artifactoryRepoKey : 'oss-snapshot-local'
                    //The Artifactory repository key to publish to
                    //when using oss.jfrog.org the credentials are from Bintray. For local build we expect them to be found in
                    //~/.gradle/gradle.properties, otherwise to be set in the build server
                    username = rootProject.artifactoryUser
                    password = rootProject.artifactoryPassword
                }
            }
        }
    }
}

artifactoryPublish {
    def curDate = new Date()
    def pomSource = { a -> "$projectDir/target/poms/pom-${a.name - 'groovy-'}.xml" }
    def destBase = { a -> "org/codehaus/groovy/${a.name}/${version}/${a.name}-${version}${a.classifier ? '-' + a.classifier : ''}" }
    def newDetails = { orig, newFile, newExt, newType -> gradleDeployDetails(new DefaultPublishArtifact(
            orig.name, newExt, newType, orig.classifier, curDate, newFile), 'artifacts', destBase(orig) + '.' + newExt) }
    def makeTransformedDetails = { orig -> newDetails(orig, orig.file, orig.extension, orig.extension) }
    def makeTransformedPomDetails = { orig -> newDetails(orig, file(pomSource(orig)), 'pom', 'pom') }
    def makeTransformedPomSigDetails = { orig -> newDetails(orig, file(pomSource(orig) + '.asc'), 'pom.asc', 'asc') }
    mavenDescriptor = new File("$projectDir/target/poms/pom-groovy.xml")
    doFirst{
        configurations.archives.artifacts.findAll{ it.name != project.name }.each {
            // the plugin we are using uses the project name rather than the artifact name
            // as the artifactId, so we add the transformed one ourselves
            // this also covers signatures which we already added during install
            deployDetails.add(makeTransformedDetails(it))
            if (!it.classifier && (it.type == 'jar' || it.type == 'zip')) {
                // add the pom and its signature
                deployDetails.add(makeTransformedPomDetails(it))
                if (isReleaseVersion) {
                    deployDetails.add(makeTransformedPomSigDetails(it))
                }
            }
        }
        deployDetails.add(makeTransformedPomDetails(name: 'groovy-all'))

        if (isReleaseVersion) {
            deployDetails.add(makeTransformedPomSigDetails(name: 'groovy-all'))
            allprojects {
                if (project == rootProject || rootProject.ext.modules().contains(project)) {
                    configurations.archives.artifacts.findAll {
                        it.name == project.name && it.type == 'jar' && it.extension == 'jar' && !it.classifier
                    }.each {
                        // add pom signatures
                        def pomSigLocation = "$project.projectDir/target/poms/pom-${project == rootProject ? 'groovy' : 'default'}.xml.asc"
                        deployDetails.add(newDetails(it, file(pomSigLocation), 'pom.asc', 'pom'))
                    }
                }
            }
        }
    }
}

artifactoryPublish.dependsOn(['backportJars', 'install'])
