apply plugin: 'java'

repositories {
    mavenCentral()

    maven {
        url "http://srdjan.mtv:8081/nexus/content/repositories/test_repo/"
    }
}

dependencies {
    compile 'io.v:vanadium:0.1-SNAPSHOT'
    compile group: 'com.google.guava', name: 'guava', version: '18.0'
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile group: 'com.google.truth', name: 'truth', version: '0.25'
}

clean {
    delete 'generated-src'
}

public static isDarwin() {
    return getOS().contains("os x")
}

public static isLinux() {
    return getOS().contains("linux")
}

public static isAmd64() {
    return getArch().contains("x86_64") || getArch().contains("amd64")
}

public static getArch() {
    return System.properties['os.arch'].toLowerCase()
}

public static getOS() {
    return System.properties['os.name'].toLowerCase()
}

class VanadiumEnvironment {
    File v23Root;
    File v23Bin;

    public static getVanadiumEnvironment() {
        VanadiumEnvironment result = new VanadiumEnvironment()

        if (!System.getenv().containsKey('V23_ROOT')) {
            throw new InvalidUserDataException("V23_ROOT is not set. "
                    + "Please follow the Vanadium installation instructions at "
                    + "https://v.io/installation/index.html")
        }

        result.v23Root = new File(System.getenv()['V23_ROOT'])
        result.v23Bin = new File(result.v23Root, ['devtools', 'bin', 'v23'].join(File.separator))
        if (!result.v23Bin.exists() || !result.v23Bin.isFile() || !result.v23Bin.canExecute()) {
            throw new InvalidUserDataException(
                    result.v23Bin.toString() + " does not exist or is not an executable file. "
                    + "Please follow the Vanadium installation instructions at "
                    + "https://v.io/installation/index.html")
        }
        return result
    }
}

def v23Root = VanadiumEnvironment.getVanadiumEnvironment().v23Root.getAbsolutePath()
def v23Bin = VanadiumEnvironment.getVanadiumEnvironment().v23Bin.getAbsolutePath()
def vdlBin = [v23Root, 'release', 'go', 'bin', 'vdl'].join(File.separator)
def vdlPath = [ [v23Root, 'roadmap', 'go', 'src'].join(File.separator),
                [v23Root, 'release', 'go', 'src'].join(File.separator) ].join(":")

sourceSets.main.java.srcDirs += 'generated-src/vdl'

task checkVanadiumEnvironment {
    VanadiumEnvironment.getVanadiumEnvironment()

    if (System.getenv('JAVA_HOME') == null) {
        throw new InvalidUserDataException("The JAVA_HOME environment variable is not set. "
                + "Please set it to the root of a JDK installation directory.  If JDK isn't "
                + "installed, you probably didn't install the java profile: try running\n\n"
                + "v23 profile install java\n\nand then try building again.")
    }
    if (!isAmd64()) {
        throw new InvalidUserDataException("Java Vanadium builds only enabled on amd64 "
                + "architectures, not: " + getArch())
    }
    if (!isLinux() && !isDarwin()) {
        throw new InvalidUserDataException("Java Vanadium builds only enabled on "
                + "linux/darwin systems, not: " + getOS())
    }
}

task buildVdlTool(type: Exec) {
    commandLine v23Bin, 'go', 'install', 'v.io/x/ref/cmd/vdl'
}

task generateVdl(type: Exec, dependsOn: buildVdlTool) {
    environment VDLPATH: vdlPath
    commandLine vdlBin, 'generate', '--lang=java', '--java-out-dir=generated-src/vdl', 'all'
}

tasks.'compileJava'.dependsOn(generateVdl)

task goBuildVanadiumLib(type: Exec, dependsOn: checkVanadiumEnvironment) {
    def env = VanadiumEnvironment.getVanadiumEnvironment()
    def existingPath = System.getenv('PATH')
    if (existingPath == null) {
        existingPath = ""
    }

    environment 'V23_PROFILE': 'java'
    commandLine env.v23Bin.getAbsolutePath(), 'go', 'install',
            '-buildmode=c-shared', '-v', '-tags', 'java', 'v.io/syncbase/jni/main'
}

// Copy the shared library to its ultimate destination.
if (isLinux()) {
    task copyVanadiumLib(type: Copy, dependsOn: goBuildVanadiumLib) {
        from v23Root + '/roadmap/go/pkg/linux_amd64_shared/v.io/syncbase/jni'
        into 'build/libs'
        include 'main.a'
        rename 'main.a', 'libv23.so'
    }
} else {  // darwin
    task copyVanadiumLib(type: Copy, dependsOn: goBuildVanadiumLib) {
        from v23Root + '/roadmap/go/pkg/darwin_amd64/v.io/syncbase/jni'
        into 'build/libs'
        include 'main.a'
        rename 'main.a', 'libv23.dylib'
    }
}

// Add shared library dependency to our tests.
tasks.withType(Test) {
    if (isDarwin()) {
        // TODO(sjr): remove these when
        // https://github.com/vanadium/issues/issues/567 is resolved.
        jvmArgs '-XX:+UnlockDiagnosticVMOptions'
        jvmArgs '-XX:-LogEvents'
    }
    systemProperty "java.library.path", "build/libs"
}

tasks.'processTestResources'.dependsOn(copyVanadiumLib)