/*
 * 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"
}

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

junitPlatform {
    enableStandardTestTask = true
    
    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 project(':common')
    compile project(':amaterasu-sdk')

    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.8'
    
    compile group: 'org.reflections', name: 'reflections', version: '0.9.11'
    compile group: 'org.eclipse.jgit', name: 'org.eclipse.jgit', version: '4.9.10.201904181027-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.importre', name: 'crayon', version: '0.1.0'
    compile group: 'com.beust', name: 'klaxon', version: '5.0.1'
    compile group: 'com.github.ajalt', name: 'clikt', version: '1.6.0'

    compile group: 'org.eclipse.jetty', name: 'jetty-plus', version: '9.4.14.v20181114'
    compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.14.v20181114'
    compile group: 'org.eclipse.jetty', name: 'jetty-http', version: '9.4.14.v20181114'
    compile group: 'org.eclipse.jetty', name: 'jetty-io', version: '9.4.14.v20181114'
    compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.14.v20181114'
    compile group: 'org.eclipse.jetty.toolchain', name: 'jetty-test-helper', version: '4.0'

    compile group: 'org.jsoup', name: 'jsoup', version: '1.10.2'
    //compile group: 'io.ktor', name: 'ktor-client-core', version: '0.9.5'

    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect"


    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.13.0'
    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')]
        kotlin {
            srcDirs = ['src/test/kotlin']
        }
    }
}

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

task copyToHome(type: Copy) {
    from 'src/main/scripts'
    into '../build/amaterasu/'
}