/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

buildscript {
    addRepos(repositories)
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'
apply plugin: 'maven'

def antlrOut = "$buildDir/generated/antlr/grammar-gen/"
sourceSets {
    main.java.srcDirs += 'src/main/grammar-gen'
    test.java.srcDirs += 'src/tests/kotlin'
    main.java.srcDirs += antlrOut
}

dependencies {
    // take from ButterKnife
    def logger = new com.android.build.gradle.internal.LoggerWrapper(project.logger)
    def sdkHandler = new com.android.build.gradle.internal.SdkHandler(project, logger)

    compile project(":room:common")
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "com.google.auto:auto-common:$auto_common_version"
    compile "com.squareup:javapoet:$javapoet_version"
    compile 'org.antlr:antlr4:4.5.3'
    testCompile "com.google.testing.compile:compile-testing:$compile_testing_version"
    testCompile "junit:junit:$junit_version"
    testCompile "com.intellij:annotations:$intellij_annotation"
    testCompile "org.mockito:mockito-core:$mockito_version"
    testCompile fileTree(dir: "${sdkHandler.sdkFolder}/platforms/android-$target_sdk_version/",
            include : "android.jar")
    testCompile fileTree(dir: "${new File(project(":room:runtime").buildDir, "libJar")}",
            include : "*.jar")
    testCompile fileTree(dir: "${new File(project(":room:db").buildDir, "libJar")}",
            include : "*.jar")
    testCompile files(org.gradle.internal.jvm.Jvm.current().getToolsJar())
}

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: rootProject.ext.localMavenRepo)
            pom.artifactId = 'compiler'
        }
    }
}

def generateAntlrTask = task('generateAntlrGrammar', type: JavaExec) {
    def outFolder = file(antlrOut)
    outputs.dir(outFolder)
    inputs.dir("$projectDir/SQLite.g4")
    classpath configurations.runtime
    main "org.antlr.v4.Tool"
    args "SQLite.g4", "-visitor", "-o", new File(outFolder, "com/android/support/room/parser").path,
            "-package", "com.android.support.room.parser"
}

tasks.findByName("compileKotlin").dependsOn(generateAntlrTask)
tasks.findByName("compileKotlin").dependsOn(":room:runtime:jarDebug")
tasks.findByName("compileKotlin").dependsOn(":room:db:jarDebug")

createKotlinCheckstyle(project)

