/*
 * Copyright 2016 Dmitry Korotych.
 *
 * Licensed 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 {
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath "com.github.dkorotych.gradle.maven.exec:gradle-maven-exec-plugin:${project.version}"
    }
}

apply plugin: "com.github.dkorotych.gradle-maven-exec"

def groupId = 'com.mycompany.app'
def artifactId = 'my-app'

println "Plugin version: ${project.version}"

tasks.register('generateMavenApplication', MavenExec) {
    def buildDir = project.layout.buildDirectory.asFile.get()
    buildDir.mkdirs()
    ext.outputDir = file("$buildDir/$artifactId")
    delete outputDir
    workingDir buildDir
    goals 'archetype:generate'
    options {
        define = [
                'groupId'            : groupId,
                'artifactId'         : artifactId,
                'archetypeArtifactId': 'maven-archetype-quickstart',
                'archetypeVersion'   : '1.4',
                'interactiveMode'    : 'false'
        ]
    }
}

tasks.register('packageMavenApplication', MavenExec) {
    dependsOn 'generateMavenApplication'
    outputs.dir file("${generateMavenApplication.outputDir}/target")
    workingDir generateMavenApplication.outputDir
    goals 'package'
}

tasks.register('checkMavenApplication', JavaExec) {
    dependsOn 'packageMavenApplication'
    def buildDir = project.layout.buildDirectory.asFile.get()
    def outputFile = file("$buildDir/output.txt")
    doFirst {
        workingDir generateMavenApplication.outputDir
        classpath file("${generateMavenApplication.outputDir}/target/${artifactId}-1.0-SNAPSHOT.jar")
        main "${groupId}.App"
        standardOutput new FileOutputStream(outputFile)
    }
    doLast {
        assert outputFile.text.trim() == 'Hello World!'
    }
}

tasks.register('checkMavenApplication2') {
    doLast {
        def buildDir = project.layout.buildDirectory.asFile.get()
        buildDir.mkdirs()
        def application = artifactId + '-second'
        def applicationDir = file("$buildDir/$application")
        delete applicationDir
        def outputFile = file("$buildDir/output.txt")
        mavenexec {
            workingDir buildDir
            goals 'archetype:generate'
            define([
                    'groupId'            : groupId,
                    'artifactId'         : application,
                    'archetypeArtifactId': 'maven-archetype-quickstart',
                    'archetypeVersion'   : '1.4',
                    'interactiveMode'    : 'false'
            ])
            quiet true
        }
        mavenexec {
            workingDir applicationDir
            goals 'package'
            threads '2C'
            quiet true
        }
        javaexec {
            workingDir applicationDir
            classpath file("$applicationDir/target/$application-1.0-SNAPSHOT.jar")
            main "${groupId}.App"
            standardOutput new FileOutputStream(outputFile)
        }
        assert outputFile.text.trim() == 'Hello World!'
    }
}

tasks.register('checkMavenApplication3') {
    doLast {
        def buildDir = project.layout.buildDirectory.asFile.get()
        buildDir.mkdirs()
        def application = artifactId + '-third'
        def applicationDir = file("$buildDir/$application")
        delete applicationDir
        mavenexec {
            workingDir buildDir
            goals 'archetype:generate'
            define([
                    'groupId'            : groupId,
                    'artifactId'         : application,
                    'archetypeArtifactId': 'maven-archetype-j2ee-simple',
                    'archetypeVersion'   : '1.4',
                    'interactiveMode'    : 'false'
            ])
            quiet true
        }
        def file = file("${applicationDir}/pom.xml")
        def content = file.text
        content = content.
                replaceAll("2.20.1", "2.22.0").
                replaceAll("2.10.1", "3.0.1")
        file.text = content
        mavenexec {
            workingDir applicationDir
            goals 'package'
            threads '1C'
            quiet true
        }
    }
}
