/*
 * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

// Configures publishing of Maven artifacts to Bintray

apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: "com.github.johnrengelman.shadow"

apply from: project.rootProject.file('gradle/maven-central.gradle')

// ------------- tasks

def isMultiplatform = project.name == "kotlinx-coroutines-core"
def isBom = project.name == "kotlinx-coroutines-bom"

if (!isMultiplatform) {
    // Regular java modules need 'java-library' plugin for proper publication
    apply plugin: 'java-library'

    // MPP projects pack their sources automatically, java libraries need to explicitly pack them
    task sourcesJar(type: Jar) {
        archiveClassifier = 'sources'
        from sourceSets.main.allSource
    }
}

// empty xxx-javadoc.jar
task javadocJar(type: Jar) {
    archiveClassifier = 'javadoc'
}

publishing {
    repositories {
        maven {
            def user = 'kotlin'
            def repo = 'kotlinx'
            def name = 'kotlinx.coroutines'
            url = "https://api.bintray.com/maven/$user/$repo/$name/;publish=0"

            credentials {
                username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER')
                password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
            }
        }
    }

    if (isBom) {
        // Configure mavenBom publication
        publications {
            mavenBom(MavenPublication) {}
        }
    } else if (!isMultiplatform) {
        // Configure java publications for regular non-MPP modules
        publications {
            maven(MavenPublication) {
                if (project.name == "kotlinx-coroutines-debug") {
                    project.shadow.component(it)
                } else {
                    from components.java
                }
                artifact sourcesJar
            }
        }
    }

    publications.all {
        pom.withXml(configureMavenCentralMetadata)

        // add empty javadocs (no need for MPP root publication which publishes only pom file)
        if (it.name != 'kotlinMultiplatform' && !isBom) {
            it.artifact(javadocJar)
        }

        // Rename MPP artifacts for backward compatibility
        def type = it.name
        switch (type) {
            case 'kotlinMultiplatform':
                it.artifactId = "$project.name-native"
                break
            case 'metadata':
                it.artifactId = "$project.name-common"
                break
            case 'jvm':
                it.artifactId = "$project.name"
                break
            case 'js':
            case 'native':
                it.artifactId = "$project.name-$type"
                break
        }

        // disable metadata everywhere, but in native modules
        if (type == 'maven' || type == 'metadata' || type == 'jvm' || type == 'js') {
            moduleDescriptorGenerator = null
        }
    }
}

task publishDevelopSnapshot() {
    def branch = System.getenv('currentBranch')
    if (branch == "develop") {
        dependsOn(":publish")
    }
}

// Compatibility with old TeamCity configurations that perform :kotlinx-coroutines-core:bintrayUpload
task bintrayUpload(dependsOn: publish)