import me.modmuss50.mpp.ReleaseType

plugins {
    id 'fabric-loom' version '1.11.8'
    id 'maven-publish'
    id "me.modmuss50.mod-publish-plugin" version "0.8.3"
}

version = project.mod_version
group = project.maven_group

base {
    archivesName = project.archives_base_name
}

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.
}

dependencies {
    // To change the versions see the gradle.properties file
    minecraft "com.mojang:minecraft:${project.minecraft_version}"
    mappings loom.officialMojangMappings()
    modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

    // Fabric API. This is technically optional, but you probably want it anyway.
    //Worldthreader requires fabric gamerule api v1
    modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

    modImplementation fabricApi.module("fabric-gametest-api-v1", project.fabric_version)

    testImplementation "net.fabricmc:fabric-loader-junit:${project.loader_version}"
}

sourceSets {
    gametest {
        java.srcDir("src/gametest/java")
        resources.srcDir("src/gametest/resources")

        compileClasspath += main.compileClasspath
        runtimeClasspath += main.runtimeClasspath
        compileClasspath += main.output
        runtimeClasspath += main.output
    }
}

tasks.named('processGametestResources') {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

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

    runs {
        gametestServer {
            server()
            name = "GameTest Server"
            vmArg("-Dfabric-api.gametest")
            runDir("run/gametestServer")
            source(sourceSets.gametest)
        }

        gametestClient {
            client()
            name = "GameTest Client"
            vmArg("-Dfabric-api.gametest")
            runDir("run/gametestClient")
            source(sourceSets.gametest)
        }
    }

    mods {
        register("worldthreader-gametest") {
            sourceSet(sourceSets.gametest)
        }
    }
}

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

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

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

java {
    // 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()

    sourceCompatibility = JavaVersion.VERSION_21
    targetCompatibility = JavaVersion.VERSION_21
}

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

// configure the maven publication
publishing {
    publications {
        create("mavenJava", MavenPublication) {
            artifactId = project.archives_base_name
            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.
    }
}

publishMods {
    changelog = rootProject.file("CHANGELOG.md").getText().trim()
    type = getReleaseType()
    file = remapJar.archiveFile

    def mod_version = "mc${project.minecraft_version}-${project.mod_version}"
    def fabric_mod_version = mod_version + "-fabric"
    def fabric_suffix = "for Fabric"
    def displayNamePrefix = project.property('mod_name').toString()
    def cfDisplayNamePrefix = displayNamePrefix + " " + mod_version
    def mrDisplayNamePrefix = displayNamePrefix + " " + project.property('mod_version').toString()

    // CurseForge options used by both Fabric and Forge
    def cfOptions = curseforgeOptions {
        accessToken = providers.environmentVariable("CURSEFORGE_API_KEY")
        projectId = "817126"

        if (project.hasProperty('minecraft_version_range_start') && project.hasProperty('minecraft_version_range_end')) {
            minecraftVersionRange {
                start = project.property('minecraft_version_range_start').toString()
                end = project.property('minecraft_version_range_end').toString()
            }
        } else {
            minecraftVersions.add(project.property('minecraft_version').toString())
        }
    }

    // Modrinth options used by both Fabric and Forge
    def mrOptions = modrinthOptions {
        accessToken = providers.environmentVariable("MODRINTH_API_KEY")
        projectId = "LwH5rYyd"


        if (project.hasProperty('minecraft_version_range_start') && project.hasProperty('minecraft_version_range_end')) {
            minecraftVersionRange {
                start = project.property('minecraft_version_range_start').toString()
                end = project.property('minecraft_version_range_end').toString()
            }
        } else {
            minecraftVersions.add(project.property('minecraft_version').toString())
        }
    }

    // Fabric specific options for CurseForge
    curseforge("curseforgeFabric") {
        from cfOptions
        modLoaders.add("fabric")
        modLoaders.add("quilt")
        version = fabric_mod_version
        displayName = cfDisplayNamePrefix + " " + fabric_suffix
    }

    // Fabric specific options for Modrinth
    modrinth("modrinthFabric") {
        from mrOptions
        modLoaders.add("fabric")
        modLoaders.add("quilt")
        version = fabric_mod_version
        displayName = mrDisplayNamePrefix + " " + fabric_suffix
    }
}

def getReleaseType() {
    def releaseType = System.getenv("RELEASE_TYPE")
    switch (releaseType) {
        case "alpha":
            return ReleaseType.ALPHA
        case "beta":
            return ReleaseType.BETA
        case "stable":
            return ReleaseType.STABLE
        default:
            if (releaseType != null) {
                throw new IllegalArgumentException("Release type must be alpha, beta or stable!")
            }
            return ReleaseType.STABLE
    }
}

tasks.register("printMinecraftVersion") {
    doLast {
        println project.minecraft_version
    }
}

tasks.register("printModVersion") {
    doLast {
        println project.mod_version
    }
}