#!/usr/bin/env bash
set -e

port_cursor=25570

create_server() {
  local name=$1
  local nixshell=$2
  local enable_via=$3

  local root=$(pwd)

  local plugin_path=$(readlink -f ../test-plugin/build/libs/scoreboard-library-test-plugin-*-all.jar)
  local jar_path="$root/cache/$name.jar"

  local server_dir="servers/$name"
  mkdir -p "$server_dir/plugins"
  pushd "$server_dir" &> /dev/null

  port=$port_cursor
  (( port_cursor++ ))
  printf "Creating server \033[32m$name\033[0m on port \033[32m$port\033[0m\n"

  echo "eula=true" > eula.txt
  printf "server-port=$port\ndifficulty=peaceful\ngenerate-structures=false\nlevel-type=flat\nallow-nether=false\nonline-mode=false" > server.properties
  cp "$root/bukkit.yml" .

  mkdir -p config
  cp "$root/paper-global.yml" config/

  ln -sf "$plugin_path" plugins/test.jar
  ln -sf "$jar_path" server.jar

  if [ "$enable_via" = "true" ]; then
    ln -sf $root/cache/viaversion.jar plugins/viaversion.jar
    ln -sf $root/cache/viabackwards.jar plugins/viabackwards.jar
    ln -sf $root/cache/viarewind.jar plugins/viarewind.jar
  fi

  local flags="-DPaper.IgnoreJavaVersion=true -Xms512M -Xmx1024M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20"

  printf "#!/bin/sh\nnix develop .#$nixshell -c sh -c 'java $flags -jar server.jar nogui'" > start
  chmod +x start

  popd &> /dev/null
}

create_spigot_server() {
  local version=$1
  local nixshell=$2

  if [ ! -f "cache/$version-spigot.jar" ]; then
    echo Running BuildTools for Spigot $version

    local root=$(pwd)

    pushd cache &> /dev/null

    mkdir -p "$version-spigot"
    pushd "$version-spigot" &> /dev/null
    nix develop ".#$nixshell" -c java -jar ../buildtools.jar --disable-java-check --nogui --rev "$version"

    if [ -f "$root/patches/spigot-$version-server.patch" ]; then
      echo Applying spigot-$version-server.patch
      pushd Spigot/Spigot-Server &> /dev/null
      git apply "$root/patches/spigot-$version-server.patch"
      popd &> /dev/null

      echo Rebuilding Spigot with patch
      nix develop ".#$nixshell" -c sh -c 'cd Spigot && bash ../apache-maven-*/bin/mvn package'
      mv Spigot/Spigot-Server/target/spigot-*.jar "spigot-$version.jar"
    fi

    mv "spigot-$version.jar" "../$version-spigot.jar"
    popd &> /dev/null
    rm -rf "$version-spigot"

    popd &> /dev/null
  fi

  create_server "$version-spigot" "$nixshell"
}

download_file() {
  local name=$1
  local url=$2
  local expected_sha256_hash=$3

  local path="cache/$name"
  mkdir -p cache

  if [ ! -f "$path" ] || [ "$(sha256sum "$path" | cut -f 1 -d ' ')" != "$expected_sha256_hash" ]; then
    echo "Downloading $name..."
    curl --silent --location --output "$path" "$url"
  fi

  local actual_hash="$(sha256sum "$path" | cut -f 1 -d ' ')"
  if [ "$actual_hash" != "$expected_sha256_hash" ]; then
    echo "ERROR: hashes for $name do not match! expected: $expected_sha256_hash, but got $actual_hash"
    rm "$path"
    exit 1
  fi
}

download_file "buildtools.jar" "https://hub.spigotmc.org/jenkins/job/BuildTools/198/artifact/target/BuildTools.jar" "23eefb5a08655fe83c40ddac7a4ca78b6b2583efccd9c98c58b27df0aa31fa35"

download_file "viaversion.jar" "https://ci.viaversion.com/job/ViaVersion-Java8/38/artifact/build/libs/ViaVersion-5.7.1-downgraded.jar" "dcce3d30e195de9a3372616298bac1acd29196e5c3676a0fba745be9e3d91808"
download_file "viabackwards.jar" "https://ci.viaversion.com/view/ViaBackwards/job/ViaBackwards-Java8/31/artifact/build/libs/ViaBackwards-5.7.1-downgraded.jar" "9727fd246d3566bffc3f71e1bda0e6db71bf5814a254e7ab5a2941ca0e94ecd6"
download_file "viarewind.jar" "https://ci.viaversion.com/view/ViaRewind/job/ViaRewind-Java8/28/artifact/build/libs/ViaRewind-4.0.14-downgraded.jar" "e84c7afa696b898a99747edba2458dd9e9f5d7c1ee2f604c409964dd4d4d784d"

# --- 1.7.10 ---
download_file "1.7.10-paper.jar" "https://fill-data.papermc.io/v1/objects/33772078d92e9dbb027602da016524ef29af5b4c12eaddac1fe2465b01108185/paper-1.7.10-2025.jar" "33772078d92e9dbb027602da016524ef29af5b4c12eaddac1fe2465b01108185"
create_server "1.7.10-paper" "jdk8"

# buildtools cannot build 1.7.10

# --- 1.8.8 ---
download_file "1.8.8-paper.jar" "https://fill-data.papermc.io/v1/objects/7ff6d2cec671ef0d95b3723b5c92890118fb882d73b7f8fa0a2cd31d97c55f86/paper-1.8.8-445.jar" "7ff6d2cec671ef0d95b3723b5c92890118fb882d73b7f8fa0a2cd31d97c55f86"
create_server "1.8.8-paper" "jdk8"

create_spigot_server "1.8.8" "jdk8"

# --- 1.9.4 ---
download_file "1.9.4-paper.jar" "https://fill-data.papermc.io/v1/objects/15a5821ddeacc596432c3fbf24262a2d264f556060ecd6f1838fb01ab5629a81/paper-1.9.4-775.jar" "15a5821ddeacc596432c3fbf24262a2d264f556060ecd6f1838fb01ab5629a81"
create_server "1.9.4-paper" "jdk8"

create_spigot_server "1.9.4" "jdk8"

# --- 1.10.2 ---
download_file "1.10.2-paper.jar" "https://fill-data.papermc.io/v1/objects/83354d24a22b6265e76c089b3d17a568abb446c0ccd12c2452f5e148412b16c2/paper-1.10.2-918.jar" "83354d24a22b6265e76c089b3d17a568abb446c0ccd12c2452f5e148412b16c2"
create_server "1.10.2-paper" "jdk8"

create_spigot_server "1.10.2" "jdk8"

# --- 1.11.2 ---
download_file "1.11.2-paper.jar" "https://fill-data.papermc.io/v1/objects/3d0f40ec1f9630dfdbafa626cc20c266d7fb90fc22583dc1b995e7fbfb76830d/paper-1.11.2-1106.jar" "3d0f40ec1f9630dfdbafa626cc20c266d7fb90fc22583dc1b995e7fbfb76830d"
create_server "1.11.2-paper" "jdk8"

create_spigot_server "1.11.2" "jdk8"

# --- 1.12.2 ---
download_file "1.12.2-paper.jar" "https://fill-data.papermc.io/v1/objects/3a2041807f492dcdc34ebb324a287414946e3e05ec3df6fd03f5b5f7d9afc210/paper-1.12.2-1620.jar" "3a2041807f492dcdc34ebb324a287414946e3e05ec3df6fd03f5b5f7d9afc210"
create_server "1.12.2-paper" "jdk8"

create_spigot_server "1.12.2" "jdk8"

# --- 1.13 ---
download_file "1.13-paper.jar" "https://fill-data.papermc.io/v1/objects/00db82d214242c9345266d44ff8d11a8e857a1a02edf7cb5fcc2d1d973283129/paper-1.13-173.jar" "00db82d214242c9345266d44ff8d11a8e857a1a02edf7cb5fcc2d1d973283129"
create_server "1.13-paper" "jdk8" "true"

create_spigot_server "1.13" "jdk8"

# --- 1.14.4 ---
download_file "1.14.4-paper.jar" "https://fill-data.papermc.io/v1/objects/bd8ec5cdb22370d37816a6de26798df3d2b0d6f9c7c96c88ca45a1303fea50e8/paper-1.14.4-245.jar" "bd8ec5cdb22370d37816a6de26798df3d2b0d6f9c7c96c88ca45a1303fea50e8"
create_server "1.14.4-paper" "jdk8"

create_spigot_server "1.14.4" "jdk8" "true"

# --- 1.15.2 ---
download_file "1.15.2-paper.jar" "https://fill-data.papermc.io/v1/objects/bd2dd6f2cc489cf9e2bb800cb4fb6d63e9d293945d3ac10b09dd9c6098fa9f34/paper-1.15.2-393.jar" "bd2dd6f2cc489cf9e2bb800cb4fb6d63e9d293945d3ac10b09dd9c6098fa9f34"
create_server "1.15.2-paper" "jdk8" "true"

create_spigot_server "1.15.2" "jdk8"

# --- 1.16.5 ---
download_file "1.16.5-paper.jar" "https://fill-data.papermc.io/v1/objects/e67da4851d08cde378ab2b89be58849238c303351ed2482181a99c2c2b489276/paper-1.16.5-794.jar" "e67da4851d08cde378ab2b89be58849238c303351ed2482181a99c2c2b489276"
create_server "1.16.5-paper" "jdk8"

create_spigot_server "1.16.5" "jdk8" "true"

# --- 1.17 ---
download_file "1.17-paper.jar" "https://fill-data.papermc.io/v1/objects/760a93b94a58d619bd647d71af84688617d0444d22b716500bc6b343858dc871/paper-1.17-79.jar" "760a93b94a58d619bd647d71af84688617d0444d22b716500bc6b343858dc871"
create_server "1.17-paper" "jdk17" "true"

create_spigot_server "1.17" "jdk17"

# --- 1.18.2 ---
download_file "1.18.2-paper.jar" "https://fill-data.papermc.io/v1/objects/0578f18f4d632b494b468ec56b3b414b5b56fea087ee7d39cf6dcdf4c9d01f05/paper-1.18.2-388.jar" "0578f18f4d632b494b468ec56b3b414b5b56fea087ee7d39cf6dcdf4c9d01f05"
create_server "1.18.2-paper" "jdk17"

create_spigot_server "1.18.2" "jdk17" "true"

# --- 1.19.4 ---
download_file "1.19.4-paper.jar" "https://fill-data.papermc.io/v1/objects/e587d78cba3e99ef8c4bc24cf20cc3bdbbe89e33b0b572070446af4eb6be5ccf/paper-1.19.4-550.jar" "e587d78cba3e99ef8c4bc24cf20cc3bdbbe89e33b0b572070446af4eb6be5ccf"
create_server "1.19.4-paper" "jdk17" "true"

create_spigot_server "1.19.4" "jdk17"

# --- 1.20.2 ---
download_file "1.20.2-paper.jar" "https://fill-data.papermc.io/v1/objects/07f57cdc5948dcf3cb3358e43b9a46fbbe8b595fa30c8749cfc102bf44897b69/paper-1.20.2-318-mojang.jar" "07f57cdc5948dcf3cb3358e43b9a46fbbe8b595fa30c8749cfc102bf44897b69"
create_server "1.20.2-paper" "jdk21"

create_spigot_server "1.20.2" "jdk21" "true"

# --- 1.20.4 ---
download_file "1.20.4-paper.jar" "https://fill-data.papermc.io/v1/objects/e84aa4943cc51d7545b1c9b669bb1e0b143323d248ebb89012182f5554bc13d7/paper-1.20.4-499-mojang.jar" "e84aa4943cc51d7545b1c9b669bb1e0b143323d248ebb89012182f5554bc13d7"
create_server "1.20.4-paper" "jdk21" "true"

create_spigot_server "1.20.4" "jdk21"

# --- 1.20.5 ---
download_file "1.20.5-paper.jar" "https://fill-data.papermc.io/v1/objects/3cd7da2f8df92e082a501a39c674aab3c0343edd179b86f5baccaebfc9974132/paper-1.20.5-22.jar" "3cd7da2f8df92e082a501a39c674aab3c0343edd179b86f5baccaebfc9974132"
create_server "1.20.5-paper" "jdk21"

# spigot doesn't have 1.20.5
create_spigot_server "1.20.6" "jdk21" "true"

# --- 1.21.3 ---
download_file "1.21.3-paper.jar" "https://fill-data.papermc.io/v1/objects/87e973e1d338e869e7fdbc4b8fadc1579d7bb0246a0e0cf6e5700ace6c8bc17e/paper-1.21.3-83.jar" "87e973e1d338e869e7fdbc4b8fadc1579d7bb0246a0e0cf6e5700ace6c8bc17e"
create_server "1.21.3-paper" "jdk21" "true"

create_spigot_server "1.21.3" "jdk21"

# --- 1.21.5 ---
download_file "1.21.5-paper.jar" "https://fill-data.papermc.io/v1/objects/2ae6ae22adf417699746e0f89fc2ef6cb6ee050a5f6608cee58f0535d60b509e/paper-1.21.5-114.jar" "2ae6ae22adf417699746e0f89fc2ef6cb6ee050a5f6608cee58f0535d60b509e"
create_server "1.21.5-paper" "jdk21"

create_spigot_server "1.21.5" "jdk21" "true"

# --- 1.21.6 ---
download_file "1.21.6-paper.jar" "https://fill-data.papermc.io/v1/objects/35e2dfa66b3491b9d2f0bb033679fa5aca1e1fdf097e7a06a80ce8afeda5c214/paper-1.21.6-48.jar" "35e2dfa66b3491b9d2f0bb033679fa5aca1e1fdf097e7a06a80ce8afeda5c214"
create_server "1.21.6-paper" "jdk21" "true"

create_spigot_server "1.21.6" "jdk21"

# --- 1.21.9 ---
download_file "1.21.9-paper.jar" "https://fill-data.papermc.io/v1/objects/aec002e77c7566e49494fdf05430b96078ffd1d7430e652d4f338fef951e7a10/paper-1.21.9-59.jar" "aec002e77c7566e49494fdf05430b96078ffd1d7430e652d4f338fef951e7a10"
create_server "1.21.9-paper" "jdk25"

# spigot doesnt have 1.21.9
create_spigot_server "1.21.10" "jdk25" "true"

# --- 1.21.11 ---
download_file "1.21.11-paper.jar" "https://fill-data.papermc.io/v1/objects/4a558a00005d33dafa4c4d5f9e47b3bd47d92311fceccd9c9754ee6b913f8649/paper-1.21.11-100.jar" "4a558a00005d33dafa4c4d5f9e47b3bd47d92311fceccd9c9754ee6b913f8649"
create_server "1.21.11-paper" "jdk25" "true"

create_spigot_server "1.21.11" "jdk25"

# --- 26.1 ---

create_spigot_server "26.1" "jdk25"

# --- 26.1.1 ---
download_file "26.1.1-paper.jar" "https://fill-data.papermc.io/v1/objects/43d08ed52c7af4e9f72769122501a5c15f99c7ace0c428a3eef040fd3f6fdbc5/paper-26.1.1-29.jar" "43d08ed52c7af4e9f72769122501a5c15f99c7ace0c428a3eef040fd3f6fdbc5"
create_server "26.1.1-paper" "jdk25" "true"

create_spigot_server "26.1.1" "jdk25"

