import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
  id 'java-library'
  id 'eclipse'
  id 'idea'
  id 'maven-publish'
  id 'net.neoforged.gradle.userdev' version '7.0.192'
  id 'org.jetbrains.kotlin.jvm' version "${kotlin_version}"
}

tasks.named('wrapper', Wrapper).configure {
  distributionType = Wrapper.DistributionType.ALL
}

version = mod_version
group = mod_group_id

repositories {
  mavenLocal()
  maven { url "https://maven.blamejared.com" }
  maven {
    url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/'
    content {
      includeGroup("software.bernie.geckolib")
    }
  }
  maven { url 'https://modmaven.dev/' }
  maven { url 'https://maven.su5ed.dev/releases' }
  maven { url 'https://maven.fabricmc.net' }
  maven { url 'https://thedarkcolour.github.io/KotlinForForge/' }
  maven { url 'https://maven.theillusivec4.top/' }
  maven { url 'https://maven.terraformersmc.com/' }
  maven { url 'https://api.modrinth.com/maven' }
}

base {
  archivesName = "${mod_id}-neoforge"
}

// Mojang ships Java 21 to end users since 1.20.6, so we should target Java 21.
java.toolchain.languageVersion = JavaLanguageVersion.of(21)
compileKotlin.compilerOptions.jvmTarget = JvmTarget.JVM_21

minecraft {
  accessTransformers {
    file('src/main/resources/META-INF/accesstransformer.cfg')
  }
}

runs {
  // applies to all the run configs below
  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
    systemProperty 'forge.logging.console.level', 'debug'

    modSource sourceSets.main
  }

  // multiple client runs to test multiplayer
  client1 {
    runType 'client'
    systemProperty 'forge.enabledGameTestNamespaces', mod_id
    getArguments().addAll '--username', 'alegian'
  }
  client2 {
    runType 'client'
    systemProperty 'forge.enabledGameTestNamespaces', mod_id
    getArguments().addAll '--username', 'azanor'
  }

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

  // 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 {
    systemProperty 'forge.enabledGameTestNamespaces', mod_id
  }

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

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

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


dependencies {
  // Specify the version of Minecraft to use.
  // Depending on the plugin applied there are several options. We will assume you applied the userdev plugin as shown above.
  // The group for userdev is net.neoforged, the module name is neoforge, and the version is the same as the neoforge version.
  // You can however also use the vanilla plugin (net.neoforged.gradle.vanilla) to use a version of Minecraft without the neoforge loader.
  // And its provides the option to then use net.minecraft as the group, and one of; client, server or joined as the module name, plus the game version as version.
  // For all intends and purposes: You can treat this dependency as if it is a normal library you would use.
  implementation "net.neoforged:neoforge:${neo_version}"

  implementation "thedarkcolour:kotlinforforge-neoforge:${kff_version}"
  implementation "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}"

  compileOnly "mezz.jei:jei-${minecraft_version}-common-api:${jei_version}"
  compileOnly "mezz.jei:jei-${minecraft_version}-neoforge-api:${jei_version}"
  compileOnly "dev.emi:emi-neoforge:${emi_version}:api"
  compileOnly "top.theillusivec4.curios:curios-neoforge:${curios_version}:api"

  if (use_runtime_optional_deps == "true") {
    localRuntime "maven.modrinth:jade:${jade_version}+neoforge"
    localRuntime "mekanism:Mekanism:${mekanism_version}"
    localRuntime "mekanism:Mekanism:${mekanism_version}:additions"
    localRuntime "mekanism:Mekanism:${mekanism_version}:generators"
    localRuntime "mekanism:Mekanism:${mekanism_version}:tools"
    if (recipe_viewer == "jei" || recipe_viewer == "both")
      localRuntime "mezz.jei:jei-${minecraft_version}-neoforge:${jei_version}"
    if (recipe_viewer == "emi" || recipe_viewer == "both")
      localRuntime "dev.emi:emi-neoforge:${emi_version}"
    localRuntime "top.theillusivec4.curios:curios-neoforge:${curios_version}"
  }
}

// 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.
// When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments.
// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html
tasks.withType(ProcessResources).configureEach {
  var replaceProperties = [
      minecraft_version      : minecraft_version,
      minecraft_version_range: minecraft_version_range,
      neo_version            : neo_version,
      neo_version_range      : neo_version_range,
      loader                 : loader,
      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,
      geckolib_version       : geckolib_version,
      kff_version            : kff_version
  ]
  inputs.properties replaceProperties

  filesMatching(['META-INF/neoforge.mods.toml']) {
    expand replaceProperties
  }
}

// Example configuration to allow publishing using the maven-publish plugin
publishing {
  publications {
    register('mavenJava', MavenPublication) {
      from components.java
    }
  }
  repositories {
    maven {
      url "file://${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
  }
}
