import org.apache.tools.ant.filters.*
import org.gradle.plugins.ide.idea.model.*
import t5build.*

description = "Central module for Tapestry, containing all core services and components"

project.ext {
    antlrSource = "src/main/antlr"
    mainGeneratedDir = "src/main/generated"
    testGeneratedDir = "src/test/generated"
    antlrOutput = "$mainGeneratedDir/antlr"
}

configurations {
    antlr3
}

dependencies {
    compile project(':tapestry-ioc')
    compile project(':tapestry-json')

    provided project(":tapestry-test")
    provided "javax.servlet:servlet-api:${versions.servletapi}"

    compile "commons-codec:commons-codec:1.5"

    // Transitive will bring in the unwanted string template library as well
    compile "org.antlr:antlr-runtime:3.3", {
        exclude group: "org.antlr", module: "stringtemplate"
    }

    // Antlr3 tool path used with the antlr3 task
    antlr3 "org.antlr:antlr:3.3"

    testRuntime "org.hsqldb:hsqldb:1.8.0.10"
}

// This may spin out as a plugin once we've got the details down pat

task generateGrammarSource(type: JavaExec) {
    description "Generates Java sources from Antlr3 grammars."
    inputs.source fileTree(dir: antlrSource, include: "**/*.g")
    outputs.dir file(antlrOutput)

    classpath configurations.antlr3

    main "org.antlr.Tool"
    args "-o", "${antlrOutput}/org/apache/tapestry5/internal/antlr"
    args inputs.sourceFiles

    doFirst {
        logger.info "Executing Antlr3 grammar generation:\n${commandLine.join(' ')}"
    }
}

task preprocessCoffeeScript(type: PreprocessCoffeeScript) {
}

task compileCoffeeScript(type: CompileCoffeeScript) {
    outputDir "${mainGeneratedDir}/compiled-coffeescript"
}

task compileProcessedCoffeescript(type: CompileCoffeeScript) {
    dependsOn preprocessCoffeeScript
    srcDir preprocessCoffeeScript.outputDir
    outputDir "${mainGeneratedDir}/compiled-processed-coffeescript"
}

task compileTestCoffeeScript(type: CompileCoffeeScript) {
    srcDir "src/test/coffeescript"
    outputDir "${testGeneratedDir}/compiled-coffeescript"
}

sourceSets {
    main {
        output.dir(compileCoffeeScript.outputDir, builtBy: compileCoffeeScript)
        output.dir(compileProcessedCoffeescript.outputDir, builtBy: compileProcessedCoffeescript)
        output.dir(antlrOutput, builtBy: generateGrammarSource)
        java {
            srcDir antlrOutput
        }
    }
    test {
        output.dir(compileTestCoffeeScript.outputDir, builtBy: compileTestCoffeeScript)
    }
}

clean.delete mainGeneratedDir, testGeneratedDir

compileJava {
    dependsOn generateGrammarSource
    options.fork(memoryMaximumSize: '512m')
}

// Not sure why this is necessary:
compileTestGroovy.dependsOn compileTestJava

jar {
    from("src/main/filtered-resources") {
        filter(ReplaceTokens, tokens: [version: project.version])
    }
}
