plugins {
    // Apply the org.jetbrains.kotlin.jvm Plugin to add support for Kotlin.
    id 'org.jetbrains.kotlin.jvm' version '2.2.21'

    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

repositories {
    mavenCentral()
    maven { url 'https://jitpack.io' }
}

test {
    minHeapSize = "512m"
    maxHeapSize = "4096m"
    jvmArgs '-XX:MaxMetaspaceSize=1024m'
}

dependencies {
    // Align versions of all Kotlin components
    implementation platform('org.jetbrains.kotlin:kotlin-bom')

    // Use the Kotlin JDK 8 standard library.
    implementation 'org.jetbrains.kotlin:kotlin-stdlib'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2'

    // This dependency is used by the application.
    implementation 'com.google.guava:guava:33.5.0-jre'


    implementation ("info.picocli:picocli:4.7.7")

    // Use the Kotlin test library.
    testImplementation 'org.jetbrains.kotlin:kotlin-test'

    // Use the Kotlin JUnit integration.
    testImplementation 'org.jetbrains.kotlin:kotlin-test-junit'
    testImplementation "org.jetbrains.kotlin:kotlin-test:2.2.21"

    implementation 'com.github.kupietz:cistern:v1.0.4'
    implementation 'org.maltparser:maltparser:1.9.2'
    implementation 'org.apache.opennlp:opennlp-tools:2.5.6'
    implementation 'org.slf4j:slf4j-simple:2.0.17'
    implementation 'org.apache.ant:ant:1.10.15'
    implementation 'org.apache.commons:commons-compress:1.28.0'

}

// Erzwinge JDK 21 Toolchain und Bytecode-Level 21
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

kotlin {
    jvmToolchain(21)
}

// Für evtl. vorhandenen Java-Quellcode
tasks.withType(JavaCompile).configureEach {
    options.release = 21
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
    kotlinOptions {
        jvmTarget = "21"
        // Falls verfügbar, sorgt dies für konsistente API-Targets ähnlich zu Java --release
        // freeCompilerArgs += ["-Xjdk-release=21"]
    }
}

application {
    // Define the main class for the application.
    mainClass = 'de.ids_mannheim.korapxmltools.KorapXmlToolKt'
}

jar {
    // Will include every single one of your dependencies, project or not
    // def lowerCasedName = baseName.toLowerCase()
    // def normalizedName = lowerCasedName.substring(0,1).toUpperCase() + lowerCasedName.substring(1)

    manifest.attributes(
            'Class-Path': configurations.compileClasspath.collect { it.getName() }.join(' '),
            'Main-Class': "de.ids_mannheim.korapxmltools.KorapXmlToolKt",
            'Implementation-Title': rootProject.name,
            'Implementation-Version': project.version
    )
    shadowJar {
        archiveBaseName.set('korapxmltool')
        archiveClassifier.set('')
        // Version ins Dateinamen aufnehmen
        archiveVersion.set(project.version.toString())
        manifest.attributes(
            'Main-Class': "de.ids_mannheim.korapxmltools.KorapXmlToolKt",
            'Implementation-Title': rootProject.name,
            'Implementation-Version': project.version
        )
    }
}


configurations {
    runtimeLib.extendsFrom implementation
}
