/*
 * Copyright 2013, Google Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.0.40'
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'antlr'

version = '0.03'

if (!('release' in gradle.startParameter.taskNames)) {
    def versionSuffix
    try {
        def git = org.eclipse.jgit.api.Git.open(file('..'))
        def head = git.getRepository().getRef('HEAD')
        versionSuffix = head.getObjectId().abbreviate(8).name()

        if (!git.status().call().clean) {
            versionSuffix += '-dirty'
        }
    } catch (Exception ex) {
        // In case we can't get the commit for some reason,
        // just use -dev
        versionSuffix = 'dev'
    }

    def baseVersion = version
    version = baseVersion + '-' + versionSuffix
} else {
    if (System.env.JDK7_HOME == null && !JavaVersion.current().isJava7()) {
        throw new InvalidUserDataException("bzzzzzzzt. Release builds must be performed with java 7. " +
                "Either run gradle with java 7, or define the JDK7_HOME environment variable.")
    }
}

if (System.env.JDK7_HOME != null) {
    sourceCompatibility = 1.7
    targetCompatibility = 1.7

    tasks.withType(JavaCompile) {
        doFirst {
            options.fork = true
            options.bootClasspath = "$System.env.JDK7_HOME/jre/lib/rt.jar"
            options.bootClasspath += "$File.pathSeparator$System.env.JDK7_HOME/jre/lib/jsse.jar"
        }
    }
}

def sandboxDir = "${buildDir}/sandbox"

// We don't want to use the org.jetbrains.intellij plugin when generating the idea project files,
// so that idea classes aren't included as project dependencies, since they will already exist
// in the plugin sdk defined for the project
if (!('idea' in gradle.startParameter.taskNames)) {
    apply plugin: 'org.jetbrains.intellij'

    intellij {
        version 'IC-15.0.6'
        pluginName 'smalidea'

        updateSinceUntilBuild false

        sandboxDirectory sandboxDir
    }

    // This prints out the directories that can be used to configure a plugin sdk in IDEA, using
    // the copy of IDEA downloaded by the org.jetbrains.intellij plugin
    task ideaDirs() {
        project.afterEvaluate {
            if (intellij != null) {
                println "IDEA Plugin jdk: ${intellij.ideaDirectory}"
                println "sources: ${project.configurations['intellij-sources'].files[0]}"
            }
        }
    }

    dependencies {
        compile files("${System.properties['java.home']}/../lib/tools.jar")
    }
} else {
    // If we're running the idea task, let's make sure nothing else is being run, since
    // we have to use a special configuration for the idea task
    if (gradle.startParameter.taskNames.size() > 1) {
        throw new InvalidUserDataException("The idea task must be run by itself.")
    }

    project(':') {
        idea {
            project {
                ipr {
                    withXml {
                        def node = it.asNode()

                        /*node.find { it.@name == 'ProjectRootManager' }
                                .@'project-jdk-type' = 'IDEA JDK'*/

                        def componentNode = node.find { it.@name == 'ProjectRunConfigurationManager' }
                        if (componentNode == null) {
                            componentNode = it.node.appendNode 'component', [name: 'ProjectRunConfigurationManager']
                        }

                        if (componentNode.find { it.@name == 'All smalidea tests' } == null) {
                            componentNode.append(new XmlParser().parseText("""
                                <configuration default="false" name="All smalidea tests" type="JUnit" factoryName="JUnit">
                                  <extension name="coverage" enabled="false" merge="false" runner="idea" />
                                  <module name="smalidea" />
                                  <option name="TEST_OBJECT" value="directory" />
                                  <option name="VM_PARAMETERS" value="-Didea.system.path=${sandboxDir}/config -Didea.system.path=${sandboxDir}/system-test -Didea.load.plugins.id=org.jf.smalidea" />
                                  <option name="WORKING_DIRECTORY" value="file://\$PROJECT_DIR\$/smalidea" />
                                  <option name="PASS_PARENT_ENVS" value="true" />
                                  <option name="TEST_SEARCH_SCOPE">
                                    <value defaultName="moduleWithDependencies" />
                                  </option>
                                  <dir value="\$PROJECT_DIR\$/smalidea/src/test/java" />
                                </configuration>"""))
                        }
                    }
                }
            }
        }
    }

    idea {
        module {
            jdkName = 'IDEA Plugin jdk'

            excludeDirs -= buildDir
            if (buildDir.exists()) {
                excludeDirs.addAll(buildDir.listFiles())
            }

            for (sourceDir in (sourceDirs + testSourceDirs)) {
                excludeDirs.remove(sourceDir);
                while ((sourceDir = sourceDir.getParentFile()) != null) {
                    excludeDirs.remove(sourceDir);
                }
            }

            iml {
                withXml {
                    def node = it.node

                    node.@type = 'PLUGIN_MODULE'

                    def pluginUrl = 'file://$MODULE_DIR$/src/main/resources/META-INF/plugin.xml'

                    def pluginNode = node.find { it.@name == 'DevKit.ModuleBuildProperties' }
                    if (pluginNode == null) {
                        node.appendNode 'component', [name: 'DevKit.ModuleBuildProperties',
                                                      url : pluginUrl]
                    } else {
                        pluginNode.@url = pluginUrl
                    }
                }
            }
        }
    }
}

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile project(':smali')
    compile depends.antlr_runtime
    compile depends.gson

    antlr depends.antlr
}

task extractTokens(type: org.gradle.api.tasks.Copy, dependsOn: ':smali:build') {
    def allArtifacts = configurations.default.resolvedConfiguration.resolvedArtifacts
    def smaliArtifact = allArtifacts.find { it.moduleVersion.id.name.equals('smali') }

    from(zipTree(smaliArtifact.file)) {
        include '**/*.tokens'
    }
    into "${buildDir}/tokens"
}

generateGrammarSource {
    def tokensDir = file("${buildDir}/tokens/org/jf/smali")
    inputs.file new File(tokensDir, 'smaliParser.tokens')
    setArguments(['-lib', tokensDir.path])
    outputDirectory(file("${buildDir}/generated-src/antlr/main/org/jf/smalidea"))
}
generateGrammarSource.dependsOn(extractTokens)

ideaModule.dependsOn(generateGrammarSource)

task release(dependsOn: 'buildPlugin') {
}

tasks.getByPath('idea').dependsOn(project(':').getTasksByName('idea', true).findAll({
    it.project.name != 'smalidea'
}))