//file:noinspection GroovyAssignabilityCheck
plugins {
    id 'java'
    id 'idea'
    id 'java-library'
    id 'maven-publish'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
    id 'net.neoforged.moddev.legacyforge' version '2.0.103'
}

tasks.named('wrapper', Wrapper).configure {
    // Define wrapper values here so as to not have to always do so when updating gradlew.properties.
    // Switching this to Wrapper.DistributionType.ALL will download the full gradle sources that comes with
    // documentation attached on cursor hover of gradle classes and methods. However, this comes with increased
    // file size for Gradle. If you do switch this to ALL, run the Gradle wrapper task twice afterwards.
    // (Verify by checking gradle/wrapper/gradle-wrapper.properties to see if distributionUrl now points to `-all`)
    distributionType = Wrapper.DistributionType.BIN
}

version = "${minecraft_version}-${mod_version}"
group = mod_group_id

repositories {
    mavenLocal()
    maven { url = "https://libraries.minecraft.net/" }
    maven { url = "https://neoforged.forgecdn.net/releases" }
    maven { url = "https://neoforged.forgecdn.net/mojang-meta" }
    flatDir {
        dir "libs"
    }
    maven {
        url "https://cursemaven.com"
        content {
            includeGroup "curse.maven"
        }
    }
    maven {
        // location of the maven that hosts JEI files before January 2023
        name = "Progwml6's maven"
        url = "https://dvs1.progwml6.com/files/maven/"
    }
    maven {
        // location of the maven that hosts JEI files since January 2023
        name = "Jared's maven"
        url = "https://maven.blamejared.com/"
    }
    maven {
        // location of a maven mirror for JEI files, as a fallback
        name = "ModMaven"
        url = "https://modmaven.dev"
    }
    maven {
        name 'luck-repo'
        url 'https://repo.lucko.me/'
        content {
            includeModule 'me.lucko', 'spark-api'
        }
    }
    maven {
        name "KosmX's maven"
        url 'https://maven.kosmx.dev/'
    }
    maven {
        name = "Curios"
        url = uri("https://maven.theillusivec4.top/")
    }
    maven {
        name = 'GeckoLib'
        url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/'
        content {
            includeGroupByRegex("software\\.bernie.*")
            includeGroup("com.eliotlash.mclib")
        }
    }
    mavenCentral()
}

base {
    archivesName = mod_id
}

// Mojang ships Java 17 to end users in 1.20.1, so mods should target Java 17.
java.toolchain.languageVersion = JavaLanguageVersion.of(17)

legacyForge {
    // Specify the version of MinecraftForge to use.
    version = project.minecraft_version + '-' + project.forge_version

    parchment {
        mappingsVersion = project.parchment_mappings_version
        minecraftVersion = project.parchment_minecraft_version
    }

    // This line is optional. Access Transformers are automatically detected
    // accessTransformers = project.files('src/main/resources/META-INF/accesstransformer.cfg')

    // Default run configurations.
    // These can be tweaked, removed, or duplicated as needed.
    runs {
        client {
            client()

            // Comma-separated list of namespaces to load gametests from. Empty = all namespaces.
            systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
        }
        clientAuth{
            devLogin = true
            client()
            systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
        }

        server {
            server()
            programArgument '--nogui'
            systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
        }

        // This run config launches GameTestServer and runs all registered gametests, then exits.
        // By default, the server will crash when no gametests are provided.
        // The gametest system is also enabled by default for other run configs under the /test command.
        gameTestServer {
            type = "gameTestServer"
            systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
        }

        data {
            systemProperty('gradle.task', 'runData')
            data()

            // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it
            // gameDirectory = project.file('run-data')

            // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
            programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
        }

        // applies to all the run configs above
        configureEach {
            // Recommended logging data for a userdev environment
            // The markers can be added/remove as needed separated by commas.
            // "SCAN": For mods scan.
            // "REGISTRIES": For firing of registry events.
            // "REGISTRYDUMP": For getting the contents of all registries.
            systemProperty 'forge.logging.markers', 'REGISTRIES'

            // Recommended logging level for the console
            // You can set various levels here.
            // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
            logLevel = org.slf4j.event.Level.DEBUG
        }
    }

    mods {
        // define mod <-> source bindings
        // these are used to tell the game which sources are for which mod
        // mostly optional in a single mod project
        // but multi mod projects should define one per mod
        "${mod_id}" {
            sourceSet(sourceSets.main)
        }
    }
}

// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }

// Sets up a dependency configuration called 'localRuntime' and a deobfuscating one called 'modLocalRuntime'
// These configurations should be used instead of 'runtimeOnly' to declare
// a dependency that will be present for runtime testing but that is
// "optional", meaning it will not be pulled by dependents of this mod.
configurations {
    runtimeClasspath.extendsFrom localRuntime
}
obfuscation {
    createRemappingConfiguration(configurations.localRuntime)
}

dependencies {
    modImplementation("blank:lib39-1.20.1:${lib39_version}")
    modRuntimeOnly("curse.maven:debug-utils-forge-783008:5337491")
    modImplementation("blank:curtain-1.20.1:1.3.2")
    modImplementation("blank:freecam-1.20.1:1.2.1")
    modImplementation("blank:carryon-1.20.1:2.1.2.7")
    modCompileOnly("mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}")
    modCompileOnly("mezz.jei:jei-${minecraft_version}-common-api:${jei_version}")
    modRuntimeOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}")
    modImplementation(jarJar("dev.kosmx.player-anim:player-animation-lib-forge:${player_anim_version}"))
    modImplementation(jarJar("curse.maven:bendy-lib-623373:4550371"))
    modImplementation(jarJar("software.bernie.geckolib:geckolib-forge-${minecraft_version}:${geckolib_version}"))
    implementation(jarJar("com.eliotlash.mclib:mclib:20"))
    modCompileOnly("top.theillusivec4.curios:curios-forge:${curios_version}:api")
    modImplementation("top.theillusivec4.curios:curios-forge:${curios_version}")
    modRuntimeOnly("top.theillusivec4.curios:curios-forge:${curios_version}")
    implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1"))
    modImplementation(jarJar("io.github.llamalad7:mixinextras-forge:0.4.1"))
    modRuntimeOnly("curse.maven:spark-361579:4738952")
    compileOnly ('me.lucko:spark-api:0.1-SNAPSHOT')
}

// Uncomment the lines below if you wish to configure mixin. The mixin file should be named modid.mixins.json.
/*
mixin {
    add sourceSets.main, "${mod_id}.refmap.json"
    config "${mod_id}.mixins.json"
}

dependencies {
    annotationProcessor 'org.spongepowered:mixin:0.8.5:processor'
}

jar {
    manifest.attributes([
            "MixinConfigs": "${mod_id}.mixins.json"
    ])
}
*/

// This block of code expands all declared replace properties in the specified resource targets.
// A missing property will result in an error. Properties are expanded using ${} Groovy notation.
var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) {
    var replaceProperties = [
            minecraft_version        : minecraft_version,
            minecraft_version_range  : minecraft_version_range,
            forge_version            : forge_version,
            forge_version_range      : forge_version_range,
            loader_version_range     : loader_version_range,
            mod_id                   : mod_id,
            mod_name                 : mod_name,
            mod_license              : mod_license,
            mod_version              : mod_version,
            mod_authors              : mod_authors,
            mod_description          : mod_description,
            mod_credits              : mod_credits,
            lib39_version            : lib39_version,
            geckolib_version         : geckolib_version,
            player_animation_version : player_anim_version,
            curios_version           : curios_version

    ]
    inputs.properties replaceProperties
    expand replaceProperties
    from "src/main/templates"
    into "build/generated/sources/modMetadata"
}
// Include the output of "generateModMetadata" as an input directory for the build
// this works with both building through Gradle and the IDE.
sourceSets.main.resources.srcDir generateModMetadata
// To avoid having to run "generateModMetadata" manually, make it run on every project reload
legacyForge.ideSyncTask generateModMetadata

// Example configuration to allow publishing using the maven-publish plugin
publishing {
    publications {
        register('mavenJava', MavenPublication) {
            from components.java
        }
    }
    repositories {
        maven {
            url "file://${project.projectDir}/repo"
        }
    }
}

tasks.withType(JavaCompile).configureEach {
    options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
}

// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior.
idea {
    module {
        downloadSources = true
        downloadJavadoc = true
    }
}
