apply plugin: "java"

sourceCompatibility = 1.8
sourceSets.main.java.srcDirs = [ "src/" ]

project.ext.mainClassName = "io.anuke.mindustry.desktop.DesktopLauncher"
project.ext.assetsDir = new File("../core/assets")

def PACKR_DIR = "$System.env.PACKR_DIR"
def ICON_DIR = new File("core/assets/sprites/icon.icns")

ext.writeVersion = {
    def pfile = new File('core/assets/version.properties')
    def props = new Properties()
    props.load(new FileInputStream(pfile))

    String code = getBuildVersion()

    props["name"] = appName
    props["version"] = versionType
    props["code"] = versionNumber
    props["build"] = code

    props.store(pfile.newWriter(), "Autogenerated file. Do not modify.")
}

ext.getPlatform = {
    if (project.hasProperty("platform")) {
        def lc = platform.toLowerCase()
        if (lc == "windows64") {
            return "windows64"
        } else if (lc == "windows32") {
            return "windows32"
        } else if (lc == "linux") {
            return "linux64"
        } else if (lc == "mac") {
            return "mac"
        } else {
            throw new InvalidUserDataException("Invalid platform. Set platform with -Pplatform=windows/linux/mac")
        }
    } else {
        throw new InvalidUserDataException("No platform defined. Set platform with -Pplatform=windows/linux/mac")
    }
}

task run(dependsOn: classes, type: JavaExec) {
    main = project.mainClassName
    classpath = sourceSets.main.runtimeClasspath
    standardInput = System.in
    workingDir = project.assetsDir
    ignoreExitValue = true
    if (project.hasProperty("appArgs")) {
        args Eval.me(appArgs)
    }
}

task debug(dependsOn: classes, type: JavaExec) {
    main = project.mainClassName
    classpath = sourceSets.main.runtimeClasspath
    standardInput = System.in
    workingDir = project.assetsDir
    ignoreExitValue = true
    debug = true
}

task dist(type: Jar) {
    dependsOn classes
    
    writeVersion()

    from files(sourceSets.main.output.classesDirs)
    from files(sourceSets.main.output.resourcesDir)
    from {configurations.compile.collect {zipTree(it)}}
    from files(project.assetsDir)

    manifest {
        attributes 'Main-Class': project.mainClassName
    }
}

task clearOut(type: Delete){
    doLast {
        delete "packr-out/"
    }
}

//note: call desktop:dist beforehand
task packrCmd() {

    doLast {

        copy {
            into PACKR_DIR
            from "build/libs/desktop-release.jar"
        }

        exec {

            commandLine "java", "-jar", PACKR_DIR + "packr.jar",
                    "--verbose",
                    "--bundle", getPackage(),
                    "--platform", getPlatform(),
                    "--executable", appName,
                    "--output", "packr-out/",
                    "--mainclass", project.ext.mainClassName,
                    "--jdk", PACKR_DIR + "jdk-" + getPlatform() + ".zip",
                    "--icon", ICON_DIR.getAbsolutePath(),
                    "--classpath", "--", PACKR_DIR + "config.json"
        }
    }
}

task fixMac (type: Copy){
    dependsOn "packrCmd"

    into "packr-out/" + appName + ".app/Contents/"
    from "packr-out/Contents/"

    doLast{
        delete{
            delete "packr-out/Contents/"
        }
    }
}

task fixWindows32 (type: Copy){
    dependsOn "packrCmd"

    into "packr-out/jre/bin/"
    from PACKR_DIR + "zip.dll"
    rename ("zip.dll", "ojdkbuild_zlib.dll")

    doLast{
        copy{
            into "packr-out/jre/bin/"
            from PACKR_DIR + "zip.dll"
        }
    }
}

task packrZip() {
    dependsOn "packrCmd"
    finalizedBy "clearOut"

    if(project.hasProperty("platform")) {

        if (getPlatform() == "mac") {
            dependsOn "fixMac"
        }

        if (getPlatform() == "windows32") {
            dependsOn "fixWindows32"
        }

        task zip (type: Zip){
            from "packr-out/"
            archiveName "$appName-${getPlatform()}-${getVersionString()}.zip"
            destinationDir(file("packr-export"))
        }

        finalizedBy 'zip'
    }
}

eclipse {
    project {
        name = appName + "-desktop"
        linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/core/assets'
    }
}

task afterEclipseImport(description: "Post processing after project generation", group: "IDE") {
  doLast {
    def classpath = new XmlParser().parse(file(".classpath"))
    new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ])
    def writer = new FileWriter(file(".classpath"))
    def printer = new XmlNodePrinter(new PrintWriter(writer))
    printer.setPreserveWhitespace(true)
    printer.print(classpath)
  }
}