import org.jetbrains.DependenciesVersionGetter

allprojects {
    group 'org.jetbrains.dokka'
    version dokka_version

    def repo = {
        artifactPattern("https://teamcity.jetbrains.com/guestAuth/repository/download/Kotlin_dev_CompilerAllPlugins/[revision]/internal/[module](.[ext])")
        artifactPattern("https://teamcity.jetbrains.com/guestAuth/repository/download/IntelliJMarkdownParser_Build/[revision]/([module]_[ext]/)[module](.[ext])")
    }

    buildscript {
        repositories {
            mavenCentral()
            jcenter()
            maven { url "http://dl.bintray.com/kotlin/kotlin-eap" }
            maven { url "https://dl.bintray.com/kotlin/kotlin-dev" }
            maven { url "https://plugins.gradle.org/m2/" }
            ivy(repo)
        }
        dependencies {
            classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7'
            classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1'

            classpath "com.gradle.publish:plugin-publish-plugin:0.9.10"
        }
    }

    repositories {
        mavenCentral()
        mavenLocal()
        maven { url  "https://dl.bintray.com/jetbrains/markdown" }
        maven { url "http://dl.bintray.com/kotlin/kotlin-eap" }
        maven { url "https://dl.bintray.com/kotlin/kotlin-dev" }
        maven { url 'https://jitpack.io' }
        maven { url "https://teamcity.jetbrains.com/guestAuth/repository/download/Kotlin_dev_CompilerAllPlugins/$bundled_kotlin_compiler_version/maven" }
        ivy(repo)
        maven { url "https://dl.bintray.com/kotlin/kotlinx.html" }
    }
}


def bintrayPublication(project, List<String> _publications) {
    configure(project, {
        apply plugin: 'com.jfrog.bintray'

        bintray {
            user = System.getenv('BINTRAY_USER')
            key = System.getenv('BINTRAY_KEY')

            pkg {
                repo = dokka_publication_channel
                name = 'dokka'
                userOrg = 'kotlin'
                desc = 'Dokka, the Kotlin documentation tool'
                vcsUrl = 'https://github.com/kotlin/dokka.git'
                licenses = ['Apache-2.0']
                version {
                    name = dokka_version
                }
            }

            publications = _publications
        }
    })
}

task wrapper(type: Wrapper) {
    gradleVersion = '4.2.1'
    distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}

def versions = DependenciesVersionGetter.getVersions(project, bundled_kotlin_compiler_version)

ext.ideaVersion = versions["idea.build.id"]
ext.markdownVersion = versions["markdown.build.id"].replace("%20", " ")

configurations {
    ideaIC
    intellijCore
}

repositories {
    maven { url 'https://www.jetbrains.com/intellij-repository/snapshots' }
    maven { url 'https://www.jetbrains.com/intellij-repository/releases' }
}

dependencies {
    intellijCore "com.jetbrains.intellij.idea:intellij-core:$ideaVersion"
    ideaIC "com.jetbrains.intellij.idea:ideaIC:$ideaVersion"
}

def intellijCoreAnalysis() {
    return zipTree(configurations.intellijCore.singleFile).matching ({
        include("intellij-core-analysis.jar")
    })
}

def ideaRT() {
    return zipTree(project.configurations.ideaIC.singleFile).matching ({
        include("lib/idea_rt.jar")
    })
}

def repoLocation = uri(file("$buildDir/dist-maven"))

allprojects {

    task publishToDistMaven {
        group "publishing"
        description "Publishes all Maven publications to Maven repository 'distMaven'."
        dependsOn tasks.withType(PublishToMavenRepository).matching {
            it.repository == publishing.repositories.distMaven
        }
    }

    plugins.withType(MavenPublishPlugin) {
        publishing {
            repositories {
                maven {
                    name 'distMaven'
                    url repoLocation
                }
            }
        }

    }
}