/*
 * Copyright 2014-2020 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
 */


/** Publish the platform JAR and POM so that consumers who depend on this module and can't read Gradle module
   metadata can still get the platform artifact and transitive dependencies from the POM: */
project.ext.publishPlatformArtifactsInRootModule = { MavenPublication platformPublication ->
    afterEvaluate {
        XmlProvider platformXml = null

        platformPublication.pom.withXml { platformXml = it }

        publishing.publications.kotlinMultiplatform {
            pom.withXml {
                Node root = asNode()
                // Remove the original content and add the content from the platform POM:
                root.children().toList().each { root.remove(it as Node) }
                platformXml.asNode().children().each { root.append(it as Node) }

                // Adjust the self artifact ID, as it should match the root module's coordinates:
                ((root.get("artifactId") as NodeList).get(0) as Node).setValue(artifactId)

                // Set packaging to POM to indicate that there's no artifact:
                root.appendNode("packaging", "pom")

                // Remove the original platform dependencies and add a single dependency on the platform module:
                Node dependencies = (root.get("dependencies") as NodeList).get(0) as Node
                dependencies.children().toList().each { dependencies.remove(it as Node) }
                Node singleDependency = dependencies.appendNode("dependency")
                singleDependency.appendNode("groupId", platformPublication.groupId)
                singleDependency.appendNode("artifactId", platformPublication.artifactId)
                singleDependency.appendNode("version", platformPublication.version)
                singleDependency.appendNode("scope", "compile")
            }
        }

        tasks.matching { it.name == "generatePomFileForKotlinMultiplatformPublication"}.configureEach {
            dependsOn(tasks["generatePomFileFor${platformPublication.name.capitalize()}Publication"])
        }
    }
}