import org.gradle.util.VersionNumber

/*
 * Copyright 2016-2020 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'

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

def isMultiplatform = project.name == "kotlinx-coroutines-core"
def isBom = project.name == "kotlinx-coroutines-bom"
def isKotlin137x = VersionNumber.parse(kotlin_version) <= VersionNumber.parse("1.3.79")

if (!isBom) {
    apply plugin: "com.github.johnrengelman.shadow"

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

if (!isMultiplatform && !isBom) {
    // 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
    }
}

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 (!isMultiplatform && !isBom) {
        // 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 {
        MavenCentralKt.configureMavenCentralMetadata(pom, project)

        // add empty javadocs
        if (!isBom && it.name != "kotlinMultiplatform") {
            it.artifact(javadocJar)
        }

        // Rename MPP artifacts for backward compatibility
        def type = it.name
        switch (type) {
            case 'kotlinMultiplatform':
                // With Kotlin 1.4 & HMPP, the root module should have no suffix in the ID, but for compatibility with
                // the consumers who can't read Gradle module metadata, we publish the JVM artifacts in it, too
                it.artifactId = isKotlin137x ? "$project.name-native" : project.name
                if (!isKotlin137x) {
                    apply from: "$rootDir/gradle/publish-mpp-root-module-in-platform.gradle"
                    publishPlatformArtifactsInRootModule(publications["jvm"])
                }
                break
            case 'metadata':
                // As the old -common dependencies will fail to resolve with Gradle module metadata, rename the module
                // to '*-metadata' so that the resolution failure are more clear
                it.artifactId = isKotlin137x ? "$project.name-common" : "$project.name-metadata"
                break
            case 'jvm':
                it.artifactId = isKotlin137x ? project.name : "$project.name-jvm"
                break
            case 'js':
            case 'native':
                it.artifactId = "$project.name-$type"
                break
        }
        // Hierarchical project structures are not fully supported in 1.3.7x MPP
        if (isKotlin137x) {
            // disable metadata everywhere, but in native and js modules
            if (type == 'maven' || type == 'metadata' || type == 'jvm') {
                moduleDescriptorGenerator = null
            }
        }

    }
}

tasks.matching { it.name == "generatePomFileForKotlinMultiplatformPublication"}.configureEach {
    dependsOn(tasks["generatePomFileForJvmPublication"])
}

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)
