apply plugin: 'maven-publish'
apply plugin: 'com.github.hierynomus.license'
apply plugin: 'fabric-loom'
apply plugin: 'com.replaymod.preprocess'
apply plugin: 'me.fallenbreath.yamlang'

int mcVersion = project.mcVersion

repositories {
	maven {
		url = 'https://jitpack.io'
	}
	maven {
		url = 'https://maven.fallenbreath.me/releases'
	}
}

// https://github.com/FabricMC/fabric-loader/issues/783
configurations {
	modRuntimeOnly.exclude group: 'net.fabricmc', module: 'fabric-loader'
}

dependencies {
	// loom
	minecraft "com.mojang:minecraft:${project.minecraft_version}"
	mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
	modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

	// runtime mods
//	if (mcVersion < 11904) {
//		modRuntimeOnly(mcVersion < 11900 ? "com.github.astei:lazydfu:0.1.2" : "com.github.Fallen-Breath:lazydfu:a7cfc44c0c")
//	}
//	// [FEATURE] MIXIN_AUDITOR
//	modRuntimeOnly 'me.fallenbreath:mixin-auditor:0.1.0'

	// dependencies
//	def fabricApiModules = ["fabric-resource-loader-v0"]
//	if (mcVersion >= 12105) {  // "fabric-resource-loader-v0" dependency since fabric api 0.127.0
//		fabricApiModules.add("fabric-api-base")
//	}
//	fabricApiModules.forEach {
//		include(modImplementation(fabricApi.module(it, project.fabric_api_version)))
//	}
//	include(modImplementation("me.fallenbreath:conditional-mixin-fabric:${project.conditionalmixin_version}"))
//	if (mcVersion < 12005) {
//		include("io.github.llamalad7:mixinextras-fabric:${project.mixinextras_version}")
//	}
}

String MIXIN_CONFIG_PATH = 'template_mod.mixins.json'
String LANG_DIR = 'assets/template_mod/lang'
JavaVersion JAVA_COMPATIBILITY
if (mcVersion >= 12005) {
	JAVA_COMPATIBILITY = JavaVersion.VERSION_21
} else if (mcVersion >= 11800) {
	JAVA_COMPATIBILITY = JavaVersion.VERSION_17
} else if (mcVersion >= 11700) {
	JAVA_COMPATIBILITY = JavaVersion.VERSION_16
} else {
	JAVA_COMPATIBILITY = JavaVersion.VERSION_1_8
}
JavaVersion MIXIN_COMPATIBILITY_LEVEL = JAVA_COMPATIBILITY

loom {
	def commonVmArgs = ['-Dmixin.debug.export=true', '-Dmixin.debug.countInjections=true']
	runConfigs.configureEach {
		// to make sure it generates all "Minecraft Client (:subproject_name)" applications
		ideConfigGenerated = true
		runDir '../../run'
		vmArgs commonVmArgs
	}
//	// [FEATURE] MIXIN_AUDITOR
//	runs {
//		def auditVmArgs = [*commonVmArgs, '-DmixinAuditor.audit=true']
//		serverMixinAudit {
//			server()
//			vmArgs auditVmArgs
//			ideConfigGenerated false
//		}
//	}
}

String modVersionSuffix = ''
String artifactVersion = project.mod_version
String artifactVersionSuffix = ''
// detect github action environment variables
// https://docs.github.com/en/actions/learn-github-actions/environment-variables#default-environment-variables
if (System.getenv("BUILD_RELEASE") != "true") {
	String buildNumber = System.getenv("BUILD_ID")
	modVersionSuffix += buildNumber != null ? ('+build.' + buildNumber) : '-SNAPSHOT'
	artifactVersionSuffix = '-SNAPSHOT'  // A non-release artifact is always a SNAPSHOT artifact
}
String fullModVersion = project.mod_version + modVersionSuffix
String fullProjectVersion, fullArtifactVersion

// Example version values:
//   project.mod_version     1.0.3                      (the base mod version)
//   modVersionSuffix        +build.88                  (use github action build number if possible)
//   artifactVersionSuffix   -SNAPSHOT
//   fullModVersion          1.0.3+build.88             (the actual mod version to use in the mod)
//   fullProjectVersion      v1.0.3-mc1.15.2+build.88   (in build output jar name)
//   fullArtifactVersion     1.0.3-mc1.15.2-SNAPSHOT    (maven artifact version)

group = project.maven_group
if (System.getenv("JITPACK") == "true") {
	// move mc version into archivesBaseName, so jitpack will be able to organize archives from multiple subprojects correctly
	base.archivesName = project.archives_base_name + '-mc' + project.minecraft_version
	fullProjectVersion = 'v' + project.mod_version + modVersionSuffix
	fullArtifactVersion = artifactVersion + artifactVersionSuffix
} else {
	base.archivesName = project.archives_base_name
	fullProjectVersion = 'v' + project.mod_version + '-mc' + project.minecraft_version + modVersionSuffix
	fullArtifactVersion = artifactVersion + '-mc' + project.minecraft_version + artifactVersionSuffix
}
version = fullProjectVersion

// See https://youtrack.jetbrains.com/issue/IDEA-296490
// if IDEA complains about "Cannot resolve resource filtering of MatchingCopyAction" and you want to know why
processResources {
	inputs.property "id", project.mod_id
	inputs.property "name", project.mod_name
	inputs.property "version", fullModVersion
	inputs.property "minecraft_dependency", project.minecraft_dependency

	filesMatching("fabric.mod.json") {
		def valueMap = [
				"id": project.mod_id,
				"name": project.mod_name,
				"version": fullModVersion,
				"minecraft_dependency": project.minecraft_dependency,
		]
		expand valueMap
	}

	filesMatching(MIXIN_CONFIG_PATH) {
		filter { s -> s.replace('{{COMPATIBILITY_LEVEL}}', "JAVA_${MIXIN_COMPATIBILITY_LEVEL.ordinal() + 1}") }
	}
}

// https://github.com/Fallen-Breath/yamlang
yamlang {
	targetSourceSets = [sourceSets.main]
	inputDir = LANG_DIR
}

// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
tasks.withType(JavaCompile).configureEach {
	options.encoding = "UTF-8"
	options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
	if (JAVA_COMPATIBILITY <= JavaVersion.VERSION_1_8) {
		// suppressed "source/target value 8 is obsolete and will be removed in a future release"
		options.compilerArgs << '-Xlint:-options'
	}
}

java {
	sourceCompatibility = JAVA_COMPATIBILITY
	targetCompatibility = JAVA_COMPATIBILITY

	// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
	// if it is present.
	// If you remove this line, sources will not be generated.
	withSourcesJar()
}

jar {
	from(rootProject.file('LICENSE')) {
		rename { "${it}_${project.archives_base_name}" }
	}
}

// https://github.com/hierynomus/license-gradle-plugin
license {
	// use "gradle licenseFormat" to apply license headers
	header = rootProject.file('HEADER.txt')
	include '**/*.java'
	skipExistingHeaders = true

	headerDefinitions {
		// ref: https://github.com/mathieucarbou/license-maven-plugin/blob/4c42374bb737378f5022a3a36849d5e23ac326ea/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/header/HeaderType.java#L48
		// modification: add a newline at the end
		SLASHSTAR_STYLE_NEWLINE {
			firstLine = "/*"
			beforeEachLine = " * "
			endLine = " */" + System.lineSeparator()
			afterEachLine = ""
			skipLinePattern = null
			firstLineDetectionPattern = "(\\s|\\t)*/\\*.*\$"
			lastLineDetectionPattern = ".*\\*/(\\s|\\t)*\$"
			allowBlankLines = false
			isMultiline = true
			padLines = false
		}
	}
	mapping {
		java = 'SLASHSTAR_STYLE_NEWLINE'
	}
	ext {
		name = project.mod_name
		author = 'Fallen_Breath'
		year = Calendar.getInstance().get(Calendar.YEAR).toString()
	}
}
classes.dependsOn licenseFormatMain
testClasses.dependsOn licenseFormatTest

// configure the maven publication
publishing {
	publications {
		mavenJava(MavenPublication) {
			from components.java
			artifactId = base.archivesName.get()
			version = fullArtifactVersion
		}
	}

	// select the repositories you want to publish to
	repositories {
		// mavenLocal()

//		// [FEATURE] FALLENS_MAVEN
//		maven {
//			url = fullArtifactVersion.endsWith("SNAPSHOT") ? "https://maven.fallenbreath.me/snapshots" : "https://maven.fallenbreath.me/releases"
//			credentials(PasswordCredentials) {
//				username = 'fallen'
//				password = System.getenv("FALLENS_MAVEN_TOKEN")
//			}
//			authentication {
//				basic(BasicAuthentication)
//			}
//		}
	}
}
