/*
 * 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', 'kotlinx-coroutines-bom']
def internal = ['kotlinx.coroutines', 'site', '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 {
    /*
     * These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
     * How does it work:
     * When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version,
     * atomicfu_version is overwritten by TeamCity environment (AFU is built with snapshot and published to mavenLocal
     * as previous step or the snapshot build).
     * Additionally, mavenLocal and Sonatype snapshots are added to repository list and stress tests are disabled.
     * DO NOT change the name of these properties without adapting kotlinx.train build chain.
     */
    def prop = rootProject.properties['build_snapshot_train']
    ext.build_snapshot_train = prop != null && prop != ""
    if (build_snapshot_train) {
        ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
        if (kotlin_version == null) {
            throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler")
        }
    }

    if (build_snapshot_train || atomicfu_version.endsWith("-SNAPSHOT")) {
        repositories {
            mavenLocal()
            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.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.moowork.gradle:gradle-node-plugin:$gradle_node_version"
        classpath "io.spring.gradle:dependency-management-plugin:$spring_dependency_management_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"
    }
}

import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType

// todo:KLUDGE: This is needed to workaround dependency resolution between Java and MPP modules
def configureKotlinJvmPlatform(configuration) {
    configuration.attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm)
}

allprojects {
    // the only place where HostManager could be instantiated
    project.ext.hostManager = new HostManager()
    def deployVersion = properties['DeployVersion']
    if (deployVersion != null) version = deployVersion

    if (build_snapshot_train) {
        ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
        println "Using Kotlin $kotlin_version for project $it"

        def skipSnapshotChecks = rootProject.properties['skip_snapshot_checks'] != null
        if (!skipSnapshotChecks && version != atomicfu_version) {
            throw new IllegalStateException("Current deploy version is $version, but atomicfu version is not overridden ($atomicfu_version) for $it")
        }

        kotlin_version = rootProject.properties['kotlin_snapshot_version']
    }

    if (build_snapshot_train || atomicfu_version.endsWith("-SNAPSHOT")) {
        repositories {
            mavenLocal()
            maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
        }
    }

    ext.unpublished = unpublished

    // This project property is set during nightly stress test
    def stressTest = project.properties['stressTest']

    // Copy it to all test tasks
    tasks.withType(Test) {
        systemProperty 'stressTest', stressTest
    }
}

allprojects {
    apply plugin: 'kotlinx-atomicfu' // it also adds all the necessary dependencies
    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"

        // 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"
        kotlinOptions.freeCompilerArgs += "-XXLanguage:+InlineClasses"
        // Binary compatibility support
        kotlinOptions.freeCompilerArgs += ["-Xdump-declarations-to=${buildDir}/visibilities.json"]
    }
}

if (build_snapshot_train) {
    println "Hacking test tasks, removing stress and flaky tests"
    allprojects {
        tasks.withType(Test).all {
            exclude '**/*LinearizabilityTest*'
            exclude '**/*LFTest*'
            exclude '**/*StressTest*'
            exclude '**/*scheduling*'
            exclude '**/*Timeout*'
            exclude '**/*definitely/not/kotlinx*'
        }
    }

    println "Manifest of kotlin-compiler-embeddable.jar for coroutines"
    configure(subprojects.findAll { it.name == "kotlinx-coroutines-core" }) {
        configurations.matching { it.name == "kotlinCompilerClasspath" }.all {
            resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each {
                def manifest = zipTree(it).matching {
                    include 'META-INF/MANIFEST.MF'
                }.getFiles().first()

                manifest.readLines().each {
                    println it
                }
            }
        }
    }
}

/*
 * 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) }) {
    if (it.name != 'kotlinx-coroutines-bom') {
        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 != "kotlinx-coroutines-bom") {
        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")
                }
            }
        }
    }
}

// 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("publish", true) + getTasksByName("publishNpm", true))

apply plugin: 'base'

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