import org.gradle.internal.os.OperatingSystem

plugins {
    id 'java-library'
    id 'maven-publish'
    id 'org.jetbrains.kotlin.jvm' version '1.5.0'
    id 'checkstyle'
}

group 'net.minestom.server'
version '1.0'

sourceCompatibility = 11
project.ext.lwjglVersion = "3.2.3"

switch (OperatingSystem.current()) {
    case OperatingSystem.LINUX:
        def osArch = System.getProperty("os.arch")
        project.ext.lwjglNatives = osArch.startsWith("arm") || osArch.startsWith("aarch64")
                ? "natives-linux-${osArch.contains("64") || osArch.startsWith("armv8") ? "arm64" : "arm32"}"
                : "natives-linux"
        break
    case OperatingSystem.MAC_OS:
        project.ext.lwjglNatives = "natives-macos"
        break
    case OperatingSystem.WINDOWS:
        project.ext.lwjglNatives = System.getProperty("os.arch").contains("64") ? "natives-windows" : "natives-windows-x86"
        break
}

allprojects {
    repositories {
        mavenCentral()
        maven { url 'https://jitpack.io' }
        maven {
            name 'sponge'
            url 'https://repo.spongepowered.org/maven'
        }
    }
    javadoc {
        options {
            destinationDir(file("docs"))
            addBooleanOption('html5', true)
            links "https://jd.adventure.kyori.net/api/$adventureVersion/"
            links "https://docs.oracle.com/en/java/javase/11/docs/api/"
        }

        // see https://stackoverflow.com/a/56641766
        doLast {
            // Append the fix to the file
            def searchScript = new File(destinationDir, '/search.js')
            searchScript.append '\n\n' +
                    'getURLPrefix = function(ui) {\n' +
                    '    return \'\';\n' +
                    '};\n'
        }
    }

    checkstyle {
        toolVersion "8.42"
        configFile file("${projectDir}/minestom_checks.xml")
    }
}

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            srcDir 'src/autogenerated/java'
        }
    }
    lwjgl {
        java {
            srcDir 'src/lwjgl/java'
        }

        compileClasspath += sourceSets.main.runtimeClasspath
        runtimeClasspath += sourceSets.main.runtimeClasspath
    }
}

java {
    // Minestom uses LWJGL libs as optional dependency if interfacing with a GPU is asked
    registerFeature("lwjgl") {
        usingSourceSet(sourceSets.lwjgl)
        withJavadocJar()
        withSourcesJar()
    }

    withJavadocJar()
    withSourcesJar()
}

test {
    useJUnitPlatform()
}

tasks.withType(Zip).configureEach {
    duplicatesStrategy DuplicatesStrategy.EXCLUDE
}

dependencies {
    // Junit Testing Framework
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
    testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.7.2')

    // Only here to ensure J9 module support for extensions and our classloaders
    testCompileOnly 'org.mockito:mockito-core:3.11.1'

    // https://mvnrepository.com/artifact/it.unimi.dsi/fastutil
    api 'it.unimi.dsi:fastutil:8.5.4'

    // https://mvnrepository.com/artifact/com.google.code.gson/gson
    api 'com.google.code.gson:gson:2.8.7'

    // Noise library for terrain generation
    // https://jitpack.io/#Articdive/Jnoise
    api 'com.github.Articdive:Jnoise:2.1.0'

    // Logging
    api 'org.apache.logging.log4j:log4j-core:2.14.1'
    // SLF4J is the base logger for most libraries, therefore we can hook it into log4j2.
    api 'org.apache.logging.log4j:log4j-slf4j-impl:2.14.1'

    // https://mvnrepository.com/artifact/org.jline/jline
    implementation group: 'org.jline', name: 'jline', version: '3.20.0'

    // Jline compatibility for windows
    // https://search.maven.org/artifact/org.fusesource.jansi/jansi/2.3.2/jar
    implementation 'org.fusesource.jansi:jansi:2.3.2'

    implementation 'com.github.ben-manes.caffeine:caffeine:3.0.3'

    // Guava 21.0+ required for Mixin
    api 'com.google.guava:guava:30.1.1-jre'

    // Code modification
    api "org.ow2.asm:asm:${asmVersion}"
    api "org.ow2.asm:asm-tree:${asmVersion}"
    api "org.ow2.asm:asm-analysis:${asmVersion}"
    api "org.ow2.asm:asm-util:${asmVersion}"
    api "org.ow2.asm:asm-commons:${asmVersion}"
    api "org.spongepowered:mixin:${mixinVersion}"

    // Path finding
    api 'com.github.MadMartian:hydrazine-path-finding:1.6.0'

    api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${project.kotlinVersion}"
    api "org.jetbrains.kotlin:kotlin-reflect:${project.kotlinVersion}"

    // NBT parsing/manipulation/saving
    api("com.github.jglrxavpok:Hephaistos:${project.hephaistosVersion}")
    api("com.github.jglrxavpok:Hephaistos:${project.hephaistosVersion}:gson")
    api("com.github.jglrxavpok:Hephaistos:${project.hephaistosVersion}") {
        capabilities {
            requireCapability("org.jglrxavpok.nbt:Hephaistos-gson")
        }
    }

    api "com.github.Minestom:DependencyGetter:v1.0.1"
    implementation 'com.github.Minestom:MinestomDataGenerator:7636d5d473'

    // Adventure, for user-interface
    api "net.kyori:adventure-api:$adventureVersion"
    api "net.kyori:adventure-text-serializer-gson:$adventureVersion"
    api "net.kyori:adventure-text-serializer-plain:$adventureVersion"
    api "net.kyori:adventure-text-serializer-legacy:$adventureVersion"

    // LWJGL, for map rendering
    lwjglApi platform("org.lwjgl:lwjgl-bom:$lwjglVersion")

    lwjglApi "org.lwjgl:lwjgl"
    lwjglApi "org.lwjgl:lwjgl-egl"
    lwjglApi "org.lwjgl:lwjgl-opengl"
    lwjglApi "org.lwjgl:lwjgl-opengles"
    lwjglApi "org.lwjgl:lwjgl-glfw"
    lwjglApi "org.lwjgl:lwjgl-glfw"
    lwjglApi 'org.joml:joml:1.9.25'
    lwjglRuntimeOnly "org.lwjgl:lwjgl::$lwjglNatives"
    lwjglRuntimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives"
    lwjglRuntimeOnly "org.lwjgl:lwjgl-opengles::$lwjglNatives"
    lwjglRuntimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives"
}

configurations.all {
    // we use jetbrains annotations
    exclude group: "org.checkerframework", module: "checker-qual"
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}