plugins {
	// Building
	id 'fabric-loom' version '1.10-SNAPSHOT'
	id "de.hysky.skyblocker.annotation-processor"
	id "com.diffplug.spotless" version "6.20.0"
	id "checkstyle"
	// Publishing
	id 'maven-publish'
	id "me.modmuss50.mod-publish-plugin" version "0.8.1"
}

version = "${project.mod_version}+${project.minecraft_version}"
group = project.maven_group

repositories {
	// Add repositories to retrieve artifacts from in here.
	// You should only use this when depending on other mods because
	// Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
	// See https://docs.gradle.org/current/userguide/declaring_repositories.html
	// for more information about repositories.
	flatDir {
		dirs 'libs'
	}

	maven {
		name = 'Maven Central'
		url = 'https://repo.maven.apache.org/maven2'
	}

	// For ModMenu and EMI
	exclusiveContent {
		forRepository {
			maven { url = "https://maven.terraformersmc.com/releases" }
		}

		filter {
			includeGroup "com.terraformersmc"
			includeGroup "dev.emi"
		}
	}

	// For REI
	exclusiveContent {
		forRepository {
			maven { url = "https://maven.shedaniel.me/" }
		}

		filter {
			includeGroup "me.shedaniel"
			includeGroup "me.shedaniel.cloth"
			includeGroup "dev.architectury"
		}
	}

	// For JEI
	exclusiveContent {
		forRepository {
			maven {
				name = "Modrinth"
				url = "https://api.modrinth.com/maven"
			}
		}

		filter {
			includeGroup "maven.modrinth"
		}
	}

	// YACL
	maven {
		url = "https://maven.isxander.dev/releases"

		content {
			includeGroup "dev.isxander"
			includeGroup "org.quiltmc.parsers"
		}
	}

	// For Minecraft snapshots
	maven {
		url = "https://maven.isxander.dev/snapshots"

		content {
			includeGroup "dev.isxander"
		}
	}

	// For Discord RPC
	exclusiveContent {
		forRepository {
			maven {
				name = "meteor-maven"
				url = "https://maven.meteordev.org/releases"
			}
		}

		filter {
			includeGroup "meteordevelopment"
		}
	}

	// For NEU repo parser
	exclusiveContent {
		forRepository {
			maven { url = "https://repo.nea.moe/releases" }
		}

		filter {
			includeGroup "moe.nea"
		}
	}

	maven {
		url = "https://maven.azureaaron.net/releases"

		content {
			includeGroup "net.azureaaron"
		}
	}

	maven {
		url = "https://maven.azureaaron.net/snapshots"

		content {
			includeGroup "net.azureaaron"
		}
	}

	maven {
		url = "https://maven.notenoughupdates.org/releases"

		content {
			includeGroup "org.notenoughupdates.moulconfig"
		}
	}

	//mavenLocal()
}

dependencies {
	testImplementation "net.fabricmc:fabric-loader-junit:${project.loader_version}"
	// To change the versions see the gradle.properties file
	minecraft "com.mojang:minecraft:${project.minecraft_version}"
	//Layered Yarn & Mojmap - used to fill in intermediary names
	mappings loom.layered {
		//Using Mojmap breaks runClient, so uncomment only for snapshots when temp mappings are needed
		//officialMojangMappings()
		mappings("net.fabricmc:yarn:${project.yarn_mappings}:v2")
	}
	modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

	// Loom does not always add this
	implementation "ca.weblite:java-objc-bridge:1.1"

	// Fabric API
	modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"

	// Dandelion
	include modImplementation("net.azureaaron:dandelion:${project.dandelion_version}")

	// YACL
	include modImplementation("dev.isxander:yet-another-config-lib:${project.yacl_version}-fabric")

	// MoulConfig - Dandelion shades it in already
	modImplementation("org.notenoughupdates.moulconfig:${project.moulconfig_flavour}:${project.moulconfig_version}")

	// HM API (Hypixel Mod API Library)
	include modImplementation("net.azureaaron:hm-api:${project.hm_api_version}")

	// Mod Menu
	modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}"

	// REI
	modCompileOnly("me.shedaniel:RoughlyEnoughItems-api-fabric:${project.rei_version}") {
		exclude group: "net.fabricmc.fabric-api" //Stop this from importing an old version of FAPI that crashes everything
	}
	//modRuntimeOnly "me.shedaniel:RoughlyEnoughItems-fabric:${project.rei_version}"

	// EMI
	modCompileOnly "dev.emi:emi-fabric:${project.emi_version}:api"
	//modLocalRuntime "dev.emi:emi-fabric:${project.emi_version}"

	// JEI (Using modrinth repo since official release is in mojmap and doesn't work)
	modCompileOnly "maven.modrinth:jei:${project.jei_version}-fabric"
	//modRuntimeOnly "maven.modrinth:jei:${project.jei_version}-fabric"

	compileOnly "com.demonwav.mcdev:annotations:${project.mcdev_annotations_version}"

	include modImplementation("meteordevelopment:discord-ipc:1.1")

	// NEU RepoParser
	include implementation("moe.nea:neurepoparser:${project.repoparser_version}")

	// Networth Calculator (https://github.com/AzureAaron/networth-calculator)
	include implementation("net.azureaaron:networth-calculator:${project.networth_calculator_version}")

	// Legacy Item DFU
	include implementation("net.azureaaron:legacy-item-dfu:${project.legacy_item_dfu_version}")

	// JGit used pull data from the NEU item repo
	include implementation("org.eclipse.jgit:org.eclipse.jgit:${project.jgit_version}")

	// Apache Commons Math
	include implementation("org.apache.commons:commons-math3:${project.commons_math_version}")

	// Apache Commons Text
	include implementation("org.apache.commons:commons-text:${project.commons_text_version}")

	// Fabric Language Kotlin for using MoulConfig - we are still a Java-exclusive mod
	modImplementation("net.fabricmc:fabric-language-kotlin:${project.flk_version}")
}

loom {
	accessWidenerPath = file("src/main/resources/skyblocker.accesswidener")

	mixin {
		useLegacyMixinAp = false
	}
}

fabricApi {
	configureTests {
		createSourceSet = true
		modId = "skyblocker-test"
		enableGameTests = false
		eula = true
	}
}

base {
	archivesName = project.archives_base_name
}

processResources {
	inputs.property "version", project.version

	filesMatching("fabric.mod.json") {
		expand "version": project.version
	}
}

tasks.withType(JavaCompile).configureEach {
	it.options.release = 21
}

java {
	sourceCompatibility = JavaVersion.VERSION_21
	targetCompatibility = JavaVersion.VERSION_21
}

jar {
	from("LICENSE") {
		rename { "${it}_${base.archivesName.get()}" }
	}
}

test {
	useJUnitPlatform()

	systemProperty("IS_TEST_ENV", "true")
}

spotless {
	java {
		removeUnusedImports()
		//indentWithTabs() // TODO: turn on when more files are converted to tabs
		trimTrailingWhitespace()
		endWithNewline()
	}

	json {
		target 'src/**/lang/en_us.json'
		targetExclude 'src/**/generated/**'
		//gson().sortByKeys().indentWithSpaces(2) // TODO: turn on in the future
	}

	groovyGradle {
		target 'src/**/*.gradle', '*.gradle', 'gradle/*.gradle'
		greclipse()
	}
}

checkstyle {
	toolVersion = "10.20.2"
	configFile = rootProject.file("checkstyle.xml")
}

publishMods {
	file = remapJar.archiveFile
	changelog = System.getenv('CHANGELOG')
	version = "v${project.version}"
	displayName = "Skyblocker ${mod_version} for ${minecraft_version}"
	modLoaders.add("fabric")
	type = STABLE

	modrinth {
		accessToken = System.getenv("MODRINTH_TOKEN")
		projectId = modrinth_id
		minecraftVersions.add(minecraft_version)
		announcementTitle = "<:modrinth:1237114573354438696> Download from Modrinth"
		requires("fabric-api", "fabric-language-kotlin")
		optional("modmenu", "rei", "emi", "jei")
		embeds("yacl")
	}

	curseforge {
		accessToken = System.getenv("CURSEFORGE_TOKEN")
		projectId = curseforge_id
		minecraftVersions.add(minecraft_version)
		announcementTitle = "<:curseforge:900697838453936149> Download from CurseForge"
		projectSlug = "skyblocker"
		requires("fabric-api", "fabric-language-kotlin")
		optional("roughly-enough-items", "emi", "jei")
		embeds("yacl")
	}

	discord {
		webhookUrl = System.getenv("DISCORD_WEBHOOK")
		username = "Changelog"
		content = changelog.map { "<@&1134565945482948638>\n## Skyblocker v${mod_version} for ${minecraft_version}\n" + it}
	}
}

// configure the maven publication
publishing {
	publications {
		mavenJava(MavenPublication) {
			from components.java
		}
	}

	// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
	repositories {
		// Add repositories to publish to here.
		// Notice: This block does NOT have the same function as the block in the top level.
		// The repositories here will be used for publishing your artifact, not for
		// retrieving dependencies.
	}
}
