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

pluginManagement {
    repositories {
        /**
         * Overrides for Teamcity 'K2 User Projects' + 'Aggregate build / Kotlinx libraries compilation' configuration:
         * kotlin_repo_url - local repository with snapshot Kotlin compiler
         * kotlin_version - kotlin version to use
         * kotlin_language_version - LV to use
         */
        val kotlinRepoUrl: String? = providers.gradleProperty("kotlin_repo_url").orNull
        if (kotlinRepoUrl?.isNotEmpty() == true) {
            maven(kotlinRepoUrl)
        }
        /*
        * This property group is used to build kotlinx.serialization against Kotlin compiler snapshot.
        * When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version.
        * DO NOT change the name of these properties without adapting kotlinx.train build chain.
        */
        val buildSnapshotTrain: String? = providers.gradleProperty("build_snapshot_train").orNull
        if (buildSnapshotTrain.equals("true", true)) {
            maven("https://oss.sonatype.org/content/repositories/snapshots")
        }

        // kotlin-dev with space redirector
        maven("https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev")

        maven("https://maven.pkg.jetbrains.space/kotlin/p/dokka/dev")
        // For Dokka that depends on kotlinx-html
        maven("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven")

        gradlePluginPortal()
        mavenCentral()
        mavenLocal()
    }
}

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0"
}

rootProject.name = "kotlinx-serialization"

include(":kotlinx-serialization-core")
project(":kotlinx-serialization-core").projectDir = file("./core")

include(":kotlinx-serialization-bom")
project(":kotlinx-serialization-bom").projectDir = file("./bom")

include(":kotlinx-serialization-json")
project(":kotlinx-serialization-json").projectDir = file("./formats/json")

include(":kotlinx-serialization-json-okio")
project(":kotlinx-serialization-json-okio").projectDir = file("./formats/json-okio")

include(":kotlinx-serialization-json-io")
project(":kotlinx-serialization-json-io").projectDir = file("./formats/json-io")

include(":kotlinx-serialization-json-tests")
project(":kotlinx-serialization-json-tests").projectDir = file("./formats/json-tests")

include(":kotlinx-serialization-protobuf")
project(":kotlinx-serialization-protobuf").projectDir = file("./formats/protobuf")

include(":kotlinx-serialization-cbor")
project(":kotlinx-serialization-cbor").projectDir = file("./formats/cbor")

include(":kotlinx-serialization-hocon")
project(":kotlinx-serialization-hocon").projectDir = file("./formats/hocon")

include(":kotlinx-serialization-properties")
project(":kotlinx-serialization-properties").projectDir = file("./formats/properties")

include(":benchmark")
project(":benchmark").projectDir = file("./benchmark")

include(":guide")
project(":guide").projectDir = file("./guide")


dependencyResolutionManagement {
    versionCatalogs {
        create("libs") {
            overriddenKotlinVersion()?.also { overriddenVersion ->
                logger.info("Overriding Kotlin version: $overriddenVersion")
                version("kotlin", overriddenVersion)
            }
        }
    }
}

fun overriddenKotlinVersion(): String? {
    val kotlinRepoUrl: String? = providers.gradleProperty("kotlin_repo_url").orNull
    val repoVersion: String? = providers.gradleProperty("kotlin_version").orNull

    val bootstrap: String? = providers.gradleProperty("bootstrap").orNull
    val bootstrapVersion: String? = providers.gradleProperty("kotlin.version.snapshot").orNull

    val buildSnapshotTrain: String? = providers.gradleProperty("build_snapshot_train").orNull
    val trainVersion: String? = providers.gradleProperty("kotlin_snapshot_version").orNull

    if (kotlinRepoUrl?.isNotEmpty() == true) {
        return repoVersion ?: throw IllegalArgumentException("\"kotlin_version\" Gradle property should be defined")
    } else if (bootstrap != null) {
        return bootstrapVersion ?: throw IllegalArgumentException("\"kotlin.version.snapshot\" Gradle property should be defined")
    }
    if (buildSnapshotTrain?.isNotEmpty() == true) {
        return trainVersion ?: throw IllegalArgumentException("\"kotlin_snapshot_version\" should be defined when building with snapshot compiler")
    }
    return null
}
