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

import org.gradle.util.VersionNumber

// Configures publishing of Maven artifacts to Maven Central

apply plugin: 'maven-publish'
apply plugin: 'signing'

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

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

if (!isBom) {
    if (project.name == "kotlinx-coroutines-debug") {
        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 {
        PublishingKt.configureMavenPublication(delegate, project)
    }

    if (!isMultiplatform && !isBom) {
        // Configure java publications for regular non-MPP modules
        publications {
            maven(MavenPublication) {
                from components.java
                artifact sourcesJar
            }
        }
    }

    publications.all {
        PublishingKt.configureMavenCentralMetadata(pom, project)
        PublishingKt.signPublicationIfKeyPresent(project, it)
        // add empty javadocs
        if (!isBom && it.name != "kotlinMultiplatform") {
            it.artifact(javadocJar)
        }

        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 =  project.name
                apply from: "$rootDir/gradle/publish-mpp-root-module-in-platform.gradle"
                publishPlatformArtifactsInRootModule(publications["jvm"])
                break
            case 'metadata':
            case 'jvm':
            case 'js':
            case 'native':
                it.artifactId = "$project.name-$type"
                break
        }
    }
}

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

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