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://kotlin.bintray.com/kotlin-plugin' }
        maven { url 'https://www.jetbrains.com/intellij-repository/releases' }
        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"
}

configurations {
    ideaIC
    intellijCore
}

repositories {
    maven { url 'https://kotlin.bintray.com/kotlin-plugin' }
    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:$idea_version"
    ideaIC "com.jetbrains.intellij.idea:ideaIC:$idea_version"
}

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

    }
}