plugins {
    id 'java'
    id 'application'
    id 'idea'
    id 'checkstyle'
    id 'jacoco'
    id 'findbugs'
    id 'org.hidetake.swagger.generator' version '2.16.0'
}

group 'org.apache.cassandra'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

// Take the application out once we're running via Cassandra
mainClassName = "org.apache.cassandra.sidecar.CassandraSidecarDaemon"
applicationName = 'CassandraSidecarDaemon'

// Config file location should be in file:/// format for local files,
def confFile = "file:" + File.separator + File.separator + "APP_HOME_TO_REPLACE/conf/sidecar.yaml"

applicationDefaultJvmArgs = ["-Dsidecar.logdir=./logs",
                             "-Dsidecar.config=" + confFile,
                             "-Dlogback.configurationFile=./conf/logback.xml",
                             "-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.SLF4JLogDelegateFactory",
                             "-javaagent:APP_HOME_TO_REPLACE/agents/jolokia-jvm-1.6.0-agent.jar=port=7777,host=localhost"]
startScripts {
    doLast {
        unixScript.text = unixScript.text.replace("APP_HOME_TO_REPLACE", "\${APP_HOME}")
    }
}

run {
    confFile = "file:" + File.separator + File.separator + "$projectDir/conf/sidecar.yaml"
    jvmArgs = ["-Dsidecar.logdir=./logs",
                                 "-Dsidecar.config=" + confFile,
                                 "-Dlogback.configurationFile=./conf/logback.xml",
                                 "-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.SLF4JLogDelegateFactory",
                                 "-javaagent:$projectDir/agents/jolokia-jvm-1.6.0-agent.jar=port=7777,host=localhost"]
}

sourceSets {
    integrationTest {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir file('src/integration/java')
        }
        resources {
            srcDirs = [main.resources, "src/integration/resources"]
        }
    }
}

configurations {
    jolokia

    integrationTestCompile.extendsFrom testCompile
    integrationTestRuntime.extendsFrom testRuntime
}

dependencies {
    compile 'io.vertx:vertx-web:3.6.3'
    compile 'io.vertx:vertx-dropwizard-metrics:3.6.3'
    compile 'io.vertx:vertx-web-client:3.6.3'

    // Trying to be exactly compatible with Cassandra's deps
    compile 'org.slf4j:slf4j-api:1.7.25'
    compile 'ch.qos.logback:logback-core:1.2.3'
    compile 'ch.qos.logback:logback-classic:1.2.3'
    compile 'com.datastax.cassandra:cassandra-driver-core:3.6+'
    compile group: 'com.google.inject', name: 'guice', version: '4.2.2'
    compile group: 'org.apache.commons', name: 'commons-configuration2', version: '2.4'

    runtime group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3'
    runtime group: 'org.yaml', name: 'snakeyaml', version: '1.23'

    jolokia 'org.jolokia:jolokia-jvm:1.6.0:agent'
    swaggerUI 'org.webjars:swagger-ui:3.10.0'

    testCompile group: 'org.cassandraunit', name: 'cassandra-unit-shaded', version: '3.3.0.2'
    testCompile 'com.datastax.cassandra:cassandra-driver-core:3.6+:tests'
    testCompile 'org.apache.commons:commons-exec:1.3+'
    testCompile group: 'org.mockito', name: 'mockito-all', version: '1.10.19'
    testCompile group: 'io.vertx', name: 'vertx-junit5', version: '3.6.3'

    integrationTestCompile group: 'com.datastax.oss.simulacron', name: 'simulacron-driver-3x', version: '0.8.7'
}

swaggerSources {
    apidoc {
        inputFile = file('api.yaml')
        reDoc {
            outputDir = file('src/main/resources/docs')
            title = 'Cassandra Sidecar API Documentation'
        }
        ui {
            outputDir = file('src/main/resources/docs/swagger')
        }
    }
}

task copyCodeStyle(type: Copy) {
    from "ide/idea/codeStyleSettings.xml"
    into ".idea"
}

// Lets copy the distributions from build/install directory to /bin and /lib
// directories to be aligned with C* distribution format
task copyDist(type: Copy) {
    from "$buildDir/install/$applicationName"
    into "$projectDir"
}

task copyJolokia(type: Copy) {
    from configurations.jolokia
    into "$projectDir/src/main/dist/agents"
}

// Lets clean distribution directories along with default build directories.
clean.doLast {
    ["agents", "bin", "conf", "lib"].each {
        println "Deleting directory $projectDir/$it"
        delete "$projectDir/$it"
    }
    println "Deleting generated docs $projectDir/src/main/resources/docs"
    delete "$projectDir/src/main/resources/docs"
}

test {
    useJUnitPlatform()
    systemProperty "javax.net.ssl.trustStore", "$projectDir/src/test/resources/certs/ca.p12"
    systemProperty "javax.net.ssl.trustStorePassword", "password"
}

task integrationTest(type: Test) {
    jacoco {
        enabled = false
    }
    useJUnitPlatform()
    testClassesDirs = sourceSets.integrationTest.output.classesDirs
    classpath = sourceSets.integrationTest.runtimeClasspath
    shouldRunAfter test
}

checkstyle {
    toolVersion '7.8.1'
    configFile file("checkstyle.xml")
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled false
        html.enabled true
    }
}

// copyDist gets called on every build
copyDist.dependsOn installDist, copyJolokia
check.dependsOn checkstyleMain, checkstyleTest, integrationTest, jacocoTestReport
build.dependsOn copyDist, generateReDoc, generateSwaggerUI, copyJolokia
run.dependsOn build
