plugins {
    id 'eclipse'
    id 'idea'
    id 'java'
    id 'groovy'
    id 'application'
}

description = "${artifactId} application"
group = "${groupId}"
version = "${version}"
mainClassName = '${package}.App'

sourceCompatibility = "1.8"
targetCompatibility = "1.8"

ext {
    versions = [
        tapestry: "@tapestryVersion@",
        tapestryTestify: "@tapestryTestifyVersion@",
        tapestryXpath: "@tapestryXpathVersion@",
        geb: "@gebVersion@",
        groovy: "@groovyVersion@",
        htmlunitDriver: "@htmlunitDriverVersion@",
        jackson: "@jacksonVersion@",
        json: "@jsonVersion@",
        selenium: "@seleniumVersion@",
        servletApi: "@servletApiVersion@",
        spock: "@spockVersion@",
        springBoot: "@springBootVersion@",
        yasson: "@yassonVersion@"
    ]
}

repositories {
    mavenCentral()
    maven {
      url 'https://repository.apache.org/content/repositories/staging/'
    }
}

configurations {
    provided
    testUnitTapestryCompile.extendsFrom(testImplementation, provided)
    testUnitTapestryRuntime.extendsFrom(testRuntimeOnly, provided)
    testFunctionalTapestryCompile.extendsFrom(testImplementation, provided)
    testFunctionalTapestryRuntime.extendsFrom(testRuntimeOnly, provided)
}

sourceSets {
    main {
        compileClasspath += configurations.provided
        // To give the same path as IDEA has
        // output.resourcesDir = 'build/production/${artifactId}'
        // output.classesDir = 'build/production/${artifactId}'
    }
    test {
        compileClasspath += configurations.provided
        runtimeClasspath += configurations.provided
        groovy {
            exclude '**/tapestry/unit/**'
            exclude '**/tapestry/functional/**'
        }
    }
    testUnitTapestry {
        groovy.srcDir file('src/test/groovy')
        resources.srcDir file('src/test/resources')
        compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath + configurations.provided
        runtimeClasspath += output + compileClasspath + configurations.provided
        groovy {
            include '**/tapestry/unit/**'
        }
    }
    testFunctionalTapestry {
        groovy.srcDir file('src/test/groovy')
        resources.srcDir file('src/test/resources')
        compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath + configurations.provided
        runtimeClasspath += output + compileClasspath + configurations.provided
        groovy {
            include '**/tapestry/functional/**'
        }
    }
}

dependencies {
    implementation platform("org.springframework.boot:spring-boot-dependencies:${versions.springBoot}")

    // Spring Boot
    def excludeSpringBootStarterLogging = { exclude(group: 'org.springframework.boot', module: 'spring-boot-starter-logging') }

    implementation("org.springframework.boot:spring-boot-starter", excludeSpringBootStarterLogging)
    implementation("org.springframework.boot:spring-boot-starter-web", excludeSpringBootStarterLogging)
    implementation("org.springframework.boot:spring-boot-starter-log4j2")

    // Apache Tapestry
    implementation("org.apache.tapestry:tapestry-core:${versions.tapestry}")

    // CoffeeScript & Less support, plus resource minification
    implementation("org.apache.tapestry:tapestry-webresources:${versions.tapestry}")

    // Uncomment this to add support for spring, hibernate, bean validation and uploads
    //implementation("org.apache.tapestry:tapestry-spring:$versions.tapestry")
    //implementation("org.apache.tapestry:tapestry-hibernate:$versions.tapestry")
    //implementation("org.apache.tapestry:tapestry-beanvalidator:$versions.tapestry")
    //implementation("org.apache.tapestry:tapestry-upload:${tapestry}")

    // Test
    def excludeTestng = { exclude(group: 'org.testng'); }

    testImplementation("org.springframework.boot:spring-boot-starter-test", excludeSpringBootStarterLogging)
    testImplementation("org.spockframework:spock-core:${versions.spock}")
    testImplementation("org.spockframework:spock-spring:${versions.spock}")
    testImplementation("org.codehaus.groovy:groovy-all:${versions.groovy}", excludeTestng)

    // Test Unit Tapestry
    testUnitTapestryCompile("org.apache.tapestry:tapestry-test:${versions.tapestry}", excludeTestng)
    testUnitTapestryCompile("net.sourceforge.tapestrytestify:tapestry-testify:${versions.tapestryTestify}", excludeTestng)
    testUnitTapestryCompile("net.sourceforge.tapestryxpath:tapestry-xpath:${versions.tapestryXpath}", excludeTestng)

    // Test Functional Tapestry
    testFunctionalTapestryCompile("org.gebish:geb-spock:${versions.geb}")
    testFunctionalTapestryCompile("org.seleniumhq.selenium:selenium-support:${versions.selenium}")
    testFunctionalTapestryCompile("org.seleniumhq.selenium:htmlunit-driver:${versions.htmlunitDiver}")

    // Miscellaneous
    runtimeOnly("org.apache.logging.log4j:log4j-slf4j-impl")
    runtimeOnly("org.eclipse:yasson:${versions.yasson}")
    runtimeOnly("org.glassfish:javax.json:${versions.json}")
    runtimeOnly("com.fasterxml.jackson.core:jackson-databind:${versions.jackson}")
    runtimeOnly("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${versions.jackson}")

    provided("javax.servlet:javax.servlet-api:${versions.servletApi}")
}

run {
    systemProperty 'tapestry.execution-mode', System.getProperty('tapestry.execution-mode')
}

test {
}

task testUnitTapestry(type: Test) {
    group = 'Verification'
    description = 'Runs the tapestry unit tests.'
    systemProperty 'tapestry.service-reloading-enabled', 'false'
    systemProperty 'tapestry.execution-mode', 'development'
    systemProperty 'geb.driver', 'htmlunit'
    testClassesDirs = sourceSets.testUnitTapestry.output.classesDirs
    classpath = project.sourceSets.testUnitTapestry.runtimeClasspath
    include '**/*Spec*'
}

task testFunctionalTapestry(type: Test) {
    group = 'Verification'
    description = 'Runs the tapestry functional tests.'
    systemProperty 'tapestry.service-reloading-enabled', 'false'
    systemProperty 'tapestry.execution-mode', 'development'
    systemProperty 'geb.driver', 'htmlunit'
    testClassesDirs = sourceSets.testFunctionalTapestry.output.classesDirs
    classpath = project.sourceSets.testFunctionalTapestry.runtimeClasspath
}
