import org.gradle.internal.os.OperatingSystem

apply plugin: 'java'
apply plugin: 'net.ltgt.errorprone'

repositories {
    mavenCentral()
}

configurations.errorprone {
    resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.9'
}

def generatedJNIHeaderLoc = "${buildDir}/include"

sourceSets {
    user {
        java {
            srcDirs = [userJavaSrc]
        }
    }
    main {
        java {
            srcDirs = [javaSrc]
        }
    }
}
    
dependencies {
    compile sourceSets.user.output
    runtime sourceSets.user.output
    compile wpilibjDep
    runtime wpilibjDep
    compile javaNetTablesDep
    runtime javaNetTablesDep
    compile fileTree(dir: javaLibraryLoc, include: ['*.jar'])
    runtime fileTree(dir: javaLibraryLoc, include: ['*.jar'])
}

jar {
    description = 'Generates jar'
    baseName = libraryName
    duplicatesStrategy = 'exclude'

    dependsOn { classes }

    if (embedJavaLibraries) {
        def tree = fileTree(dir: javaLibraryLoc, include: ['*.jar'])
        tree.each {
            from zipTree(it.path)
        }
    }

    if (embedJavaLibraries) {
        from sourceSets.user.output
    }
}

/**
 * Generates the JNI headers
 */
task jniHeaders {
    description = 'Generates JNI headers'
    group = 'WPILib'
    def outputFolder = file(generatedJNIHeaderLoc)
    inputs.files sourceSets.main.output
    outputs.file outputFolder
    doLast {
        outputFolder.mkdirs()
        exec {
            ignoreExitValue = true
            executable org.gradle.internal.jvm.Jvm.current().getExecutable('javah')
            args '-d', outputFolder
            args '-classpath', sourceSets.main.runtimeClasspath.asPath
            args jniDefinitions
        }
    }
}

ext.getNativeJNISymbols = {
    def symbolsList = []

    jniHeaders.outputs.files.each {
        FileTree tree = fileTree(dir: it)
        tree.each { File file ->
            file.eachLine { line ->
                if (line.trim()) {
                    if (line.startsWith("JNIEXPORT ") && line.contains('JNICALL')) {
                        def (p1, p2) = line.split('JNICALL').collect { it.trim() }
                        // p2 is our JNI call
                        symbolsList << p2
                    }
                }
            }
        }
    }

    return symbolsList
}

clean {
    delete generatedJNIHeaderLoc
}

compileJava {
    options.compilerArgs << '-Xlint:unchecked' << "-Werror"
}

javadoc {
    options.addStringOption('Xdoclint:none', '-quiet')
}

// This creates a lambda that the main build.gradle can access, which sets up the JNI includes for the
// target build platform. This lambda is exposed as a property in the main build.gradle.
ext.setupJniIncludes = { binaries ->
    def platformSpecificIncludeFlag = { loc, cppCompiler ->
        if (OperatingSystem.current().isWindows()) {
            cppCompiler.args "/I$loc"
        } else {
            cppCompiler.args '-I', loc
        }
    }
    binaries.all {
        tasks.withType(CppCompile) {
            cppCompiler.args '-I', file("${rootDir}/java/arm-linux").absolutePath
            cppCompiler.args '-I', file("${rootDir}/java/arm-linux/linux").absolutePath

            jniHeaders.outputs.files.each { file ->
                cppCompiler.args '-I', file.getPath()
            }

            dependsOn jniHeaders
        }
    }
}
