import java.nio.file.Paths
import java.util.concurrent.TimeUnit

plugins {
	id("application")
	id("java")
	id("wrapper")
	
	id("com.github.johnrengelman.shadow").version("5.2.0")
}

version = "1.2.1-SNAPSHOT"

final isSnapshot = project.version.endsWith("-SNAPSHOT")

final SOURCE_ENCODING = "UTF-8"

wrapper {
	gradleVersion = "6.3"
	distributionType = Wrapper.DistributionType.ALL
}

repositories {
	jcenter()
	if (isSnapshot) {
		maven {
			name("Sonatype snapshots")
			url("https://oss.sonatype.org/content/repositories/snapshots")
		}
	}
}

configurations.all {
	resolutionStrategy {
		cacheChangingModulesFor(0, TimeUnit.SECONDS)
	}
}

dependencies {
	implementation(group: "com.google.code.gson", name: "gson", version: "2.8.6")
	implementation(group: "com.google.guava", name: "guava", version: "28.2-jre")
	implementation(group: "de.hhu.stups", name: "de.prob2.kernel", version: "3.11.0")
	implementation(group: "io.github.spencerpark", name: "jupyter-jvm-basekernel", version: "2.3.0")
	implementation(group: "org.jetbrains", name: "annotations", version: "18.0.0")
	implementation(group: "se.sawano.java", name: "alphanumeric-comparator", version: "1.4.1")
}

sourceCompatibility = "1.8"
targetCompatibility = "1.8"

tasks.withType(JavaCompile) {
	options.encoding = SOURCE_ENCODING
}

def readCurrentGitCommit() {
	def proc = ["git", "rev-parse", "HEAD"].execute(null, project.projectDir)
	def exitCode = proc.waitFor()
	if (exitCode != 0) {
		throw new IllegalStateException("git rev-parse command exited with status code ${exitCode}:\n" + proc.err.readLines().join("\n"))
	}
	return proc.in.readLines()[0]
}

final currentGitCommit = readCurrentGitCommit()
processResources {
	inputs.property("project.version", project.version)
	inputs.property("currentGitCommit", currentGitCommit)
	filesMatching("de/prob2/jupyter/build.properties") {
		expand(version: project.version, commit: readCurrentGitCommit())
	}
}

mainClassName = "de.prob2.jupyter.Main"

final KERNEL_SPEC_OUTPUT_PATH = project.buildDir.toPath().resolve(Paths.get("kernelspec"))

task createKernelSpec(type: JavaExec) {
	dependsOn = [shadowJar]
	main = project.mainClassName
	args = ["createKernelSpec", KERNEL_SPEC_OUTPUT_PATH.toString()]
	classpath(shadowJar.archiveFile)
	if (project.hasProperty("probHome")) {
		systemProperty("prob.home", project.probHome)
	}
	outputs.dir(KERNEL_SPEC_OUTPUT_PATH.toFile())
	doFirst {
		delete(KERNEL_SPEC_OUTPUT_PATH)
		mkdir(KERNEL_SPEC_OUTPUT_PATH)
	}
}

task installKernelSpec(type: Exec) {
	dependsOn = [createKernelSpec]
	executable = project.hasProperty("jupyterCommand") ? project.jupyterCommand : "jupyter"
	def installFlag
	if (project.hasProperty("kernelspecUserInstall") && project.kernelspecUserInstall == "true") {
		installFlag = "--user"
	} else {
		installFlag = "--sys-prefix"
	}
	args = ["kernelspec", "install", installFlag, "--name=prob2", KERNEL_SPEC_OUTPUT_PATH.toString()]
}