import org.apache.tools.ant.filters.ReplaceTokens

import static virgobuild.VirgoToolsPlugin.installProduct
import static virgobuild.VirgoToolsPlugin.publishProduct

apply plugin: 'distribution'

distributions {
    main {
        baseName = 'virgo-nano'
        contents {
            from ( 'src/main/filtered' ) {
                include ( '**/*.properties' )
                include ( '**/.version' )
                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
            }
            from ( 'src/main/filtered' ) {
                include ( 'bin/*.sh' )
                fileMode 0755
            }
            from ( "${buildDir}/VN/nano/" ) {
                exclude ( 'Eclipse.app' )
                // Remove unwanted *kernel* bundles from nano deliverable
                exclude('plugins/*.kernel.*')
            }
            from ( "${buildDir}/common_resources/" )
        }
    }
    full {
        baseName = 'virgo-nano-full'
        contents {
            from ( 'src/main/filtered' ) {
                include ( '**/*.properties' )
                include ( '**/.version' )
                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
            }
            from ( 'src/main/filtered' ) {
                include ( 'bin/*.sh' )
                fileMode 0755
            }
            from ( 'src/main/dist' ) {
            }
            from ( 'src/full/dist' ) {
            }
            from ( "${buildDir}/VNF/nano-full/" ) {
                exclude ( 'Eclipse.app' )
                // Remove unwanted *kernel* bundles from nano deliverable
                exclude('plugins/*.kernel.*')
            }
            from ( "${buildDir}/common_resources/" )
        }
    }
}

task ('assembleNano', dependsOn: [
    'installProductNano',
    'installProductNanoFull',
    'packageResourcesAndProducts'
]) {
    installDist.dependsOn(['assembleNano'])
    installFullDist.dependsOn(['assembleNano'])
    distZip.dependsOn(['assembleNano'])
    fullDistZip.dependsOn(['assembleNano'])
}

task ('packageResourcesAndProducts', dependsOn: [
    ':kernel:org.eclipse.virgo.kernel.equinox.extensions:jar',
    ':kernel:org.eclipse.virgo.management.console:jar',
    ':nano:org.eclipse.virgo.nano.authentication:jar',
    ':nano:org.eclipse.virgo.nano.shutdown:jar',
    ':util:org.eclipse.virgo.util.env:jar',
]) {
    doLast {
        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
    }
}

// start in debug mode with gradle publish<ID>
tasks.addRule("Pattern: publish<ID>") { String taskName ->
    if (taskName.startsWith("publish")) {
        task (taskName, dependsOn: [
            ':org.eclipse.virgo.site:publishBase',
            ':org.eclipse.virgo.site:publishNanoBase',
        ]) {
            def product = 'undefined'
            switch (taskName.toString() - 'publish') {
                case 'Nano': product = 'nano'; break
                case 'NanoFull': product = 'nano-full'; break
            }

            description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."

            def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")

            doLast() { publishProduct(project, productFileLocation) }
        }
    }
}

task ('groupPublish', dependsOn: [
    ':org.eclipse.virgo.site:publishNanoCore',
    ':org.eclipse.virgo.site:publishNanoBase',
    'publishNano',
    'publishNanoFull',
]){ }

tasks.addRule("Pattern: installProduct<ID>") { String taskName ->
    if (taskName.startsWith("installProduct")) {
        task (taskName, dependsOn: ['groupPublish',]) {
            def product = 'undefined'
            def shortProduct = 'undefined'
            switch (taskName.toString() - 'installProduct') {
                case 'Nano': product = 'nano'; shortProduct = "VN"; break
                case 'NanoFull': product = 'nano-full'; shortProduct = "VNF"; break
            }

            description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."

            def destinationDir = file("${buildDir}/${shortProduct}/${product}")
            def productIu = "${product}.product"

            doLast() { installProduct(project, productIu, destinationDir) }
        }
    }
}

task ('groupInstall', dependsOn: [
    'installProductNano',
    'installProductNanoFull',
]){ }
