import org.apache.tools.ant.taskdefs.condition.Os

plugins {
	id 'fabric-loom' version '1.11-SNAPSHOT'
	id 'maven-publish'
	id "com.modrinth.minotaur" version "2.+"
	id "com.matthewprenger.cursegradle" version "1.+"
}

archivesBaseName = project.archives_base_name
version = project.mod_version
group = project.maven_group

apply from: 'common.gradle'

def createLink(source, target) {
	if (new File(rootProject.projectDir, target).exists()) {
		println("Target ${target} already exists, skipping symbolic link creation")
		return
	}
	
	try {
		exec {
			source = new File(rootProject.projectDir, source).getCanonicalPath()
			target = new File(rootProject.projectDir, target).getCanonicalPath()
			new File(target).getParentFile().mkdirs()
			
			if (Os.isFamily(Os.FAMILY_WINDOWS)) {
				println("Creating link from ${source} to ${target} (Windows)")
				commandLine "cmd", "/c", "mklink /J \"${target}\" \"${source}\""
			} else if (Os.isFamily(Os.FAMILY_UNIX)) {
				println("Creating link from ${source} to ${target} (Unix)")
				commandLine "sh", "-c", "ln -s \"${source}\" \"${target}\""
			}
		}
	} catch(Exception e){
		println("Exception: $e")
	}
}

def setupLinks() {
	println("Setting up symbolic links...")

	for(platform in ["forge", "neoforge"]) {
		createLink("./src/main/java/com/aizistral/nochatreports/common", "./${platform}/src/main/java/com/aizistral/nochatreports/common")
		createLink("./src/main/resources/assets", "./${platform}/src/main/resources/assets")
		createLink("./src/main/resources/mixins/common", "./${platform}/src/main/resources/mixins/common")

		if (!new File("./${platform}/src/main/java/com/aizistral/nochatreports/common/platform/PlatformProvider.java").exists()) {
			throw new IllegalStateException("No PlatformProvider found :/")
		}
	}

	createLink("./forge/deps", "./neoforge/deps")
}

setupLinks()

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

java {
	// withSourcesJar()

	sourceCompatibility = JavaVersion.VERSION_21
	targetCompatibility = JavaVersion.VERSION_21
}

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

	mixin {
		add(sourceSets.main, "nochatreports.refmap.json")
	}
}

repositories {
	maven { url "https://maven.shedaniel.me/" }
	maven { url "https://maven.terraformersmc.com/releases/" }
	maven { url 'https://jitpack.io' }
	maven { url "file:///${project.projectDir}/deps/" }
}

dependencies {
	minecraft "com.mojang:minecraft:${project.minecraft_version}"
	mappings loom.officialMojangMappings()
	modImplementation "net.fabricmc:fabric-loader:${project.fabric_loader_version}"
	modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
	modImplementation "com.terraformersmc:modmenu:${project.mod_menu_version}"
	modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config_version}") {
		exclude(group: "net.fabricmc.fabric-api")
	}
}

processResources {
	duplicatesStrategy = DuplicatesStrategy.EXCLUDE
	inputs.property "version", project.version

	filesMatching("fabric.mod.json") {
		expand 'mod_license': mod_license, 
		'version': version, 
		'mod_id' : mod_id, 
		'mod_name': mod_name, 
		'mod_url': mod_url, 
		'mod_author': mod_author, 
		'mod_icon': mod_icon, 
		'mod_description': mod_description,
		'issue_tracker_url': issue_tracker_url,
		'contributor_0': contributor_0
	}

    from("${rootProject.projectDir}/docs") {
        include 'CHANGELOG.md'
    }
	
	from("${rootProject.projectDir}") {
        include 'LICENSE'
	}
}

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

java {
	// withSourcesJar()
}

//task testJar (type: Jar) {
//	classifier = 'test'
//	from sourceSets.test.output
//	testJar.finalizedBy('prepareRemapJar')
//	testJar.finalizedBy('remapJar')
//
//	from("LICENSE") {
//		// NO-OP
//	}
//	
//	doFirst {
//		remapJar.classifier = 'test-reobf'
//		remapJar.inputFile = testJar.outputs.files.singleFile
//	}
//}

curseforge {

    project {
		println("Pushing CurseGradle specifications for project ID: ${curse_id}")	
	
		// Specified as cmd argument
        apiKey = findProperty('curseKey') ?: 'none'
        
		id = "${curse_id}"
        releaseType = "${version_type}"
        changelogType = 'markdown'
        changelog = file('docs/CHANGELOG.md')
		mainArtifact(remapJar)
		
		addGameVersion project.minecraft_version
		addGameVersion "1.21.9"
		addGameVersion 'Fabric'
		addGameVersion 'Java 21'
		
		relations {
			requiredDependency 'fabric-api'
			optionalDependency 'modmenu'
			optionalDependency 'cloth-config'
		}
		
		afterEvaluate {
			uploadTask.dependsOn(remapJar)
		}
		
		//debug = true
        //addArtifact(sourcesJar)
        //addArtifact(apiJar)
    }
	
	options {
		forgeGradleIntegration = false
	}
}

modrinth {
    token = findProperty('modrinthKey') ?: 'none'
    projectId = "no-chat-reports"
    versionNumber = "Fabric-" + project.mod_version
	versionName = "No Chat Reports Fabric-" + project.mod_version
    versionType = "${version_type}"
	changelog = rootProject.file("docs/CHANGELOG.md").text
    uploadFile = remapJar
    gameVersions = [ project.minecraft_version, "1.21.9" ]
	loaders = ['fabric']
	
	dependencies {
		// The scope can be `required`, `optional`, or `incompatible`
		required.project "fabric-api"
		optional.project "modmenu"
		optional.project "cloth-config"
    }
	
	syncBodyFrom = rootProject.file("docs/README.md").text
}

tasks.modrinth.dependsOn(tasks.modrinthSyncBody)

afterEvaluate {
	upload.dependsOn(remapJar)
}

task upload {
	dependsOn('modrinth')
	dependsOn('curseforge')
}
