/*
 * Copyright 2016-2021 JetBrains s.r.o. 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 ->

    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"])
    }

}
