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,
// when we have the fix for adding /conf directory to classpaht, we can get away with below default JvmArg
def confFile = "file:" + File.separator + File.separator + "APP_HOME_TO_REPLACE/conf/sidecar.yaml"

applicationDefaultJvmArgs = ["-Dsidecar.logdir=./logs",
                             "-Dsidecar.config=" + confFile,
                             "-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,
                                 "-Dvertx.logger-delegate-factory-class-name=io.vertx.core.logging.SLF4JLogDelegateFactory",
                                 "-javaagent:$projectDir/src/dist/agents/jolokia-jvm-1.6.0-agent.jar=port=7777,host=localhost"]
}

sourceSets {
    // This is needed as gradle considers `src/main/resources` as the default resources folder
    main {
        resources {
            srcDirs = ['conf', 'setup', 'src/main/resources']
        }
    }
    test {
        resources {
            srcDirs = [main.resources, "src/test/resources"]
        }
    }
    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/dist/agents"
}

// Lets clean /bin and /lib directories along with default build directories.
clean {
    println "Deleting directory $projectDir/bin"
    delete "$projectDir/bin"
    println "Deleting directory $projectDir/lib"
    delete "$projectDir/lib"
    println "Deleting agents $projectDir/src/dist/agents"
    delete "$projectDir/src/dist/agents"
    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
check.dependsOn checkstyleMain, checkstyleTest, integrationTest, jacocoTestReport
build.dependsOn copyDist, generateReDoc, generateSwaggerUI, copyJolokia
