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

    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.6"
        }
    }

    repositories {
        mavenCentral()
        mavenLocal()
        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"]

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