/*
 * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */
import org.jetbrains.kotlin.konan.target.HostManager

apply from: rootProject.file("gradle/experimental.gradle")

def rootModule = "kotlinx.coroutines"
def coreModule = "kotlinx-coroutines-core"
// Not applicable for Kotlin plugin
def sourceless = ['kotlinx.coroutines', 'site']
def internal = sourceless + ['benchmarks', 'knit', 'js-stub', 'stdlib-stubs', 'binary-compatibility-validator']
// Not published
def unpublished = internal + ['kotlinx-coroutines-rx-example', 'example-frontend-js', 'android-unit-tests']

static def platformOf(project) {
    def name = project.name
    if (name.endsWith("-js")) return "js"
    if (name.endsWith("-common") || name.endsWith("-native")) {
        throw IllegalStateException("$name platform is not supported")
    }
    return "jvm"
}

buildscript {
    ext.useKotlinSnapshot = rootProject.properties['kotlinSnapshot'] != null
    if (useKotlinSnapshot) {
        ext.kotlin_version = '1.2-SNAPSHOT'
        repositories {
            maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
        }
    }
    repositories {
        jcenter()
        maven { url "https://kotlin.bintray.com/kotlinx" }
        maven { url "https://kotlin.bintray.com/kotlin-dev" }
        maven { url "https://kotlin.bintray.com/kotlin-eap" }
        maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" }
        maven { url "https://plugins.gradle.org/m2/" }
    }

    dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:$artifactory_plugin_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
        classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicFU_version"
        classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$bintray_version"
        classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version"

        // JMH plugins
        classpath "com.github.jengelman.gradle.plugins:shadow:4.0.2"
        classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.7"
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.10"
    }
}

allprojects {
    // the only place where HostManager could be instantiated
    project.ext.hostManager = new HostManager()
}

allprojects {
    apply plugin: 'kotlinx-atomicfu'

    def deployVersion = properties['DeployVersion']
    if (deployVersion != null) version = deployVersion
    if (useKotlinSnapshot) {
        kotlin_version = '1.2-SNAPSHOT'
    }

    def projectName = it.name
    repositories {
        /*
         * google should be first in the repository list because some of the play services
         * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution
         */
        if (projectName == "kotlinx-coroutines-play-services") {
            google()
        }
        jcenter()
        maven { url "https://kotlin.bintray.com/kotlin-dev" }
        maven { url "https://kotlin.bintray.com/kotlin-eap" }
        maven { url "https://kotlin.bintray.com/kotlinx" }
    }

    if (projectName == rootModule || projectName == coreModule) return

    // Add dependency to core source sets. Core is configured in kx-core/build.gradle
    evaluationDependsOn(":$coreModule")
    if (sourceless.contains(projectName)) return

    def platform = platformOf(it)
    apply from: rootProject.file("gradle/compile-${platform}.gradle")


    dependencies {
        // See comment below for rationale, it will be replaced with "project" dependency
        compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
        compileOnly "org.jetbrains.kotlinx:atomicfu:$atomicFU_version"

        // the only way IDEA can resolve test classes
        testCompile project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
    }

    tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all {
        kotlinOptions.freeCompilerArgs += experimentalAnnotations.collect { "-Xuse-experimental=" + it }
        kotlinOptions.freeCompilerArgs += "-progressive"
        // Binary compatibility support
        kotlinOptions.freeCompilerArgs += ["-Xdump-declarations-to=${buildDir}/visibilities.json"]
    }
}

/*
 * Hack to trick nmpp plugin: we are renaming artifacts in order to provide backward compatibility for dependencies,
 * but publishing plugin does not re-read artifact names for kotlin-jvm projects, so renaming is not applied in pom files
 * for JVM-only projects.
 *
 * We artificially replace "project" dependency with "module" one to have proper names in pom files, but then substitute it 
 * to have out "project" dependency back.
 */
configure(subprojects.findAll { it.name != coreModule && it.name != rootModule }) {
    configurations.all {
        resolutionStrategy.dependencySubstitution {
            substitute module("org.jetbrains.kotlinx:kotlinx-coroutines-core:$version") with project(':kotlinx-coroutines-core')
        }
    }
}

// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != "benchmarks" && it.name != coreModule }) {
    sourceSets {
        main.kotlin.srcDirs = ['src']
        test.kotlin.srcDirs = ['test']
        main.resources.srcDirs = ['resources']
        test.resources.srcDirs = ['test-resources']
    }
}

def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/"
def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list"

configure(subprojects.findAll { !unpublished.contains(it.name) }) {
    apply from: rootProject.file('gradle/dokka.gradle')
    apply from: rootProject.file('gradle/publish-bintray.gradle')
}

configure(subprojects.findAll { !unpublished.contains(it.name) }) {
    if (it.name != coreModule) {
        dokka.dependsOn project(":$coreModule").dokka
        tasks.withType(dokka.getClass()) {
            externalDocumentationLink {
                url = new URL(core_docs_url)
                packageListUrl = new URL("file://$core_docs_file")
            }
        }
    }

    if (platformOf(it) == "jvm") {
        dokkaJavadoc.dependsOn project(":$coreModule").dokka
    }
}


// Report Kotlin compiler version when building project
println("Using Kotlin compiler version: $org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION")

// --------------- Configure sub-projects that are published ---------------
task deploy(dependsOn: getTasksByName("bintrayUpload", true) + getTasksByName("publishNpm", true))

apply plugin: 'base'

clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }
