#!/bin/env bash

MC_LOADER="${MC_LOADER:="paper"}"
MC_VERSION=${MC_VERSION:="1.21.4"}

JAVA_VERSION=${JAVA_VERSION:="temurin@21"}
JAR=${JAR:="server.jar"}
MEM=${MEMORY:=2G}
ADD_ARGS=${ADD_ARGS:=""}

RESTART=${RESTART:="true"}

crash() {
    sleep 5
    exit 1
}

setEula() {
    if [[ ! -s "eula.txt" ]]; then
        echo "#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA)." >eula.txt
        echo "eula=true" >>eula.txt
    fi
}

javaCheck(){
    JAVA_HOME=/data/java/${JAVA_VERSION}
    if [[ -f "$HOME/.jabba/jabba.sh" ]]; then
        source $HOME/.jabba/jabba.sh
    else
        echo "Something went wrong with locating jabba(the java installer)"
        exit 0
    fi

    if [[ ! -n "${JAVA_VERSION}" ]]; then
        echo "NO JAVA_VERSION ENVIRONMENT VARIABLE SET SET IT"
        crash
    fi

    if [[ ! -f "/data/java/${JAVA_VERSION}/bin/java" ]]; then
        rm -rf /data/java/${JAVA_VERSION}
        jabba install ${JAVA_VERSION} -o /data/java/${JAVA_VERSION}
    fi
    PATH=${JAVA_HOME}/bin:$PATH
    JAVA="java"
}

getPaper() {
    LATEST_BUILD=$(curl -s https://api.papermc.io/v2/projects/${MC_LOADER}/versions/${MC_VERSION}/builds |
        jq -r '.builds | map(select(.channel == "default") | .build) | .[-1]')

    if [ "$LATEST_BUILD" != "null" ]; then
        JAR_NAME=${MC_LOADER}-${MC_VERSION}-${LATEST_BUILD}.jar
        PAPERMC_URL="https://api.papermc.io/v2/projects/${MC_LOADER}/versions/${MC_VERSION}/builds/${LATEST_BUILD}/downloads/${JAR_NAME}"

        # Download the latest Paper version
        curl -o server.jar $PAPERMC_URL
        echo "Download completed"
        echo "Minecraft Version: ${MC_VERSION}"
        echo "Paper Version: ${LATEST_BUILD}"
    else
        echo "No stable build for version $MC_VERSION found :("
    fi
}

getFabric(){
    LATEST_BUILD=$(curl -s https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION} | jq -s '.[] .[0] .loader .version' | tr -d '"')
    LATEST_INSTALLER=$(curl -s https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml | xmllint --xpath "/metadata/versioning/latest/text()" -)
    DL_URL=https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}/${LATEST_BUILD}/${LATEST_INSTALLER}/server/jar
    if [ "$LATEST_BUILD" != "null" ]; then
        echo "$DL_URL"
        curl -o server.jar ${DL_URL}
    else
        echo "TODO ERROR TEXT"
    fi

}

getForge(){
    LATEST_BUILD=$(curl -s https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json | jq -r ".promos[\"${MC_VERSION}-latest\"]")
    DL_BUILD=${MC_VERSION}-${LATEST_BUILD}
    DL_URL=https://maven.minecraftforge.net/net/minecraftforge/forge/$DL_BUILD/forge-$DL_BUILD-installer.jar
    if [ "$LATEST_BUILD" != "null" ]; then
        echo "$DL_URL"
        curl -o forge-install.jar ${DL_URL}
        echo "$JAVA -jar forge-install.jar --installServer"
        $JAVA -jar forge-install.jar --installServer
        ln -s forge-${MC_VERSION}-${LATEST_BUILD}-shim.jar server.jar
        touch server.properties

        rm -f user_jvm_args.txt
        rm -f forge-install.jar
        rm -f forge-install.jar.log
        rm -f README.txt
        rm -f run.bat
        rm -f run.sh
    else
        echo "TODO ERROR TEXT"
    fi
}

serverSelect(){
    mkdir -p /data/server
    cd /data/server
    if [[ ! -f server.jar ]]; then
        case $MC_LOADER in
        vanilla)
            getVanilla
            ;;
        paper)
            getPaper
            ;;
        fabric)
            getFabric
            ;;
        forge)
            getForge
            ;;
        *)
            echo "Server of type ${MC_LOADER} is not recognized."
            crash
            ;;
        esac
    fi
}

buildCommand(){
    JAVA_ARGS="-Xms${MEM} -Xmx${MEM}"
    if [[ -z ${ADD_ARGS+x} ]]; then
        RUN_STRING="${ADD_ARGS} ${JAVA_ARGS} -jar ${JAR} nogui"
    else
        RUN_STRING="${JAVA_ARGS} -jar ${JAR} nogui"
    fi
}

runServer(){
    setEula
    while true; do
        if [[ -f $JAR ]]; then
            buildCommand
            echo "${JAVA} ${RUN_STRING}"
            $JAVA ${RUN_STRING} 
        else
            echo "${JAR} not found."
        fi
        if [[ "${RESTART}" != "true" ]]; then
            echo "Exiting..."
            exit 0
        fi
        echo -e "\n${RD}Automatically restarting server in 5 seconds. Press CTRL + C to abort and exit.${NC}"
        sleep 5
    done
}

# ------------------------------------------------------------------------------- #

javaCheck

serverSelect

runServer