/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 {

    repositories {
        mavenCentral()
        maven {
            url 'http://repository.jetbrains.com/all'
        }
        maven {
            url "https://jetbrains.jfrog.io/jetbrains/spek-snapshots"
        }
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
    }
}

plugins {
    id "com.github.johnrengelman.shadow" version "2.0.4"
    id 'scala'
}

apply plugin: 'kotlin'
apply plugin: 'org.junit.platform.gradle.plugin'

junitPlatform {
    filters {
        engines {
            include 'spek'
        }
    }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    maven { url "https://plugins.gradle.org/m2/" }
    maven { url 'http://repository.jetbrains.com/all' }
    maven { url "https://jetbrains.jfrog.io/jetbrains/spek-snapshots" }
    maven { url "http://dl.bintray.com/jetbrains/spek" }
    maven { url "http://oss.jfrog.org/artifactory/oss-snapshot-local" }

    mavenCentral()
    jcenter()
}

dependencies {
    compile 'org.scala-lang:scala-library:2.11.8'

    compile project(':common')
    compile project(':amaterasu-sdk')

    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-scala_2.11', version: '2.6.3'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.6.4'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.6.4'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.6.4'
    compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.6.4'
    compile group: 'org.reflections', name: 'reflections', version: '0.9.11'
    compile group: 'org.eclipse.jgit', name: 'org.eclipse.jgit', version: '4.2.0.201601211800-r'
    compile group: 'org.apache.activemq', name: 'activemq-broker', version: '5.15.3'
    runtime group: 'org.apache.activemq', name: 'activemq-kahadb-store', version: '5.15.3'
    compile group: 'com.andreapivetta.kolor', name: 'kolor', version: '0.0.2'
    compile group: 'com.beust', name: 'klaxon', version: '5.0.1'
    compile group: 'com.github.ajalt', name: 'clikt', version: '1.6.0'

    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect"
    compile('com.uchuhimo:konf:0.11') {
        exclude group: 'org.eclipse.jgit'
    }

    testCompile 'org.jetbrains.spek:spek-api:1.1.5'
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    testCompile 'org.apache.curator:curator-test:2.9.1'
    testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'

    // Spek requires kotlin-reflect, can be omitted if already in the classpath
    testRuntimeOnly "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

}

sourceSets {
    test {
        resources.srcDirs += [file('src/test/resources')]
    }
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
