/*
 * STAROPENSOURCE ENGINE SOURCE FILE
 * Copyright (c) 2024 The StarOpenSource Engine Contributors
 * Licensed under the GNU Affero General Public License v3
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

import java.nio.file.Files



// Plugins
plugins {
    id("java")
    id("io.freefair.lombok") version("${pluginLombok}")
    id("io.github.goooler.shadow") version("${pluginShadow}")
    id("xyz.jpenilla.run-paper") version("${pluginRunTask}")
}

// Dependencies
dependencies {
    // -> Runtime <-
    // Lombok
    compileOnly("org.projectlombok:lombok:${dependencyLombok}")
    annotationProcessor("org.projectlombok:lombok:${dependencyLombok}")

    // JetBrains Annotations
    compileOnly("org.jetbrains:annotations:${dependencyJetbrainsAnnotations}")

    // Adventure
    implementation("net.kyori:adventure-api:${dependencyAdventure}")
    implementation("net.kyori:adventure-platform-bukkit:${dependencyAdventureBukkit}")

    // PaperMC API
    compileOnly("io.papermc.paper:paper-api:${minecraftVersion}${minecraftPaperApiVersion}")

    // -> Project <-
    implementation(project(":base"))
    implementation(project(":minecraft"))
}

// Set to Minecraft's Java version
java {
    toolchain.languageVersion.set(JavaLanguageVersion.of(project.minecraftJavaVersion))
}

// Fix delombok task
delombok.doFirst {
    File target = file("${project.projectDir}/src/main/module-info.java")
    File source = file("${project.projectDir}/src/main/java/module-info.java")

    target.delete()
    source.renameTo(target)
}
delombok.doLast {
    File target = file("${project.projectDir}/src/main/java/module-info.java")
    File source = file("${project.projectDir}/src/main/module-info.java")

    target.delete()
    source.renameTo(target)
}

// Javadoc configuration
javadoc {
    outputs.upToDateWhen { false }  // Force task execution
    dependsOn(delombok)  // Make sure the source is delomboked first

    javadoc {
        setClasspath(files(project.sourceSets.main.compileClasspath))  // Include dependencies

        options {
            if (new File(projectDir, "src/main/javadoc/theme.css").exists())
                stylesheetFile = new File(projectDir, "src/main/javadoc/theme.css")  // Theming is cool :3
            setMemberLevel(JavadocMemberLevel.PUBLIC)  // Only display public stuff
            setOverview("src/main/javadoc/overview.html")  // We want a custom overview page to greet the visitor
            setLocale("en_US")  // 你好

            setJFlags([
                    "-Duser.language=en_US"  // See above
            ])
        }
    }
}

// Configure run-task plugin
runServer {
    // Set minecraft version
    minecraftVersion("${minecraftVersion}")

    // Enforce UTF-8 encoding
    systemProperty("file.encoding", "UTF-8")

    // Agree to EULA
    systemProperty("com.mojang.eula.agree", "true")

    // From :testapp
    systemProperty("sosengine.base.loggerLevel", "diagnostic")

    doFirst {
        // Disable bStats
        File config = new File(runDirectory.get().getAsFile().getPath() + "/plugins/bStats/config.yml")
        if (!config.exists()) {
            config.getParentFile().mkdirs()
            config.createNewFile()
            config.write("enabled: false\n")
        }

        // Copy test extension to load directory
        File source = new File(project(":minecraft:bukkit:testextension").projectDir.getPath() + "/build/libs/").listFiles()[0]
        File target = new File(runDirectory.get().getAsFile().getPath() + "/plugins/testextension.jar")

        target.getParentFile().mkdirs()
        target.delete();
        Files.copy(source.toPath(), target.toPath())
    }
}

// Update plugin.yml
processResources {
    filesMatching("plugin.yml") {
        expand project.properties
    }
}