#!/bin/bash

# shellcheck source=start-utils
. "$(dirname "$0")/start-utils"
isDebugging && set -x

set -eo pipefail

spigotBuildLog="/data/spigot_build.log"

function handleFailedSpigotBuild {
  logError "Failed to build Spigot"
  cat ${spigotBuildLog}
  exit 1
}


function buildSpigotFromSource {
  local tempDir="/data/temp"

  if [[ ${TYPE^^} = *BUKKIT ]] && ! versionLessThan "1.14"; then
    logError "Craftbukkit build is only supported for versions less than 1.14"
    exit 1
  fi

  log "Building Spigot $VANILLA_VERSION from source, might take a while, get some coffee"
  rm -rf ${tempDir}
  mkdir ${tempDir}
  cd ${tempDir}

  jvmOpts=""

  if isPercentage "${INIT_MEMORY:-$MEMORY}"; then
    jvmOpts+="-XX:InitialRAMPercentage=$(getPercentageValue "${INIT_MEMORY:-$MEMORY}") "
  else
    jvmOpts+="-Xms${INIT_MEMORY:-$MEMORY} "
  fi

  if isPercentage "${MAX_MEMORY:-$MEMORY}"; then
    jvmOpts+="-XX:MaxRAMPercentage=$(getPercentageValue "${MAX_MEMORY:-$MEMORY}")"
  else
    jvmOpts+="-Xmx${MAX_MEMORY:-$MEMORY}"
  fi

  logn ''
  curl -sSL -o ${tempDir}/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar && \
    java $jvmOpts -jar ${tempDir}/BuildTools.jar --rev "$VERSION" 2>&1 |tee ${spigotBuildLog}| while read l; do echo -n .; done; log "done"

  case ${TYPE^^} in
    SPIGOT)
      if ! mv spigot-*.jar "/data/${SERVER}"; then
        handleFailedSpigotBuild
      fi
      ;;
    *BUKKIT)
      if ! mv craftbukkit-*.jar "/data/${SERVER}"; then
        handleFailedSpigotBuild
      fi
      ;;
  esac

  log "Cleaning up"
  rm -rf ${tempDir}
  cd /data
}

function downloadSpigot {
  local match
  local getBukkitBaseUrl="https://getbukkit.org/download/"
  local getBukkitSpigotUrl="${getBukkitBaseUrl}spigot" 
  case "$TYPE" in
    *BUKKIT|*bukkit)
      match="CraftBukkit"
      downloadUrl=${BUKKIT_DOWNLOAD_URL}
      getbukkitFlavor=craftbukkit
      ;;
    *)
      match="Spigot"
      downloadUrl=${SPIGOT_DOWNLOAD_URL}
      getbukkitFlavor=spigot
      ;;
  esac

  if [[ ${VERSION^^} = LATEST ]]; then
    if ! downloadUrl=$(restify "${getBukkitBaseUrl}/${getbukkitFlavor}" --id='downloadr' | jq -r '.[0] | .href '); then
      logError "Failed to retrieve latest version from ${getBukkitSpigotUrl} -- site might be down"
      exit 1
    fi
  fi

  if [[ -z $downloadUrl ]]; then
    downloadUrl="https://cdn.getbukkit.org/${getbukkitFlavor}/${getbukkitFlavor}-${VERSION}.jar"
  fi

  log "Downloading $match from $downloadUrl if missing ..."

  if ! SERVER=$(get -o /data --skip-existing --output-filename "$downloadUrl"); then

    cat <<EOF

ERROR: failed to download from $downloadUrl
       Visit ${getBukkitBaseUrl}${getbukkitFlavor} to lookup the
       exact version or see if download site is unavailable.
       Click into the version entry to find the **exact** version.

EOF
      exit 1
    fi
    export SERVER
}

function setServerVar {
  case "$TYPE" in
    *BUKKIT|*bukkit)
      export SERVER=craftbukkit_server-${VERSION}.jar
      ;;
    *)
      export SERVER=spigot_server-${VERSION}.jar
      ;;
  esac
}

if isTrue "$BUILD_SPIGOT_FROM_SOURCE" || isTrue "$BUILD_FROM_SOURCE"; then
  resolveVersion
  setServerVar
  if [ ! -f "$SERVER" ] || isTrue "$FORCE_REDOWNLOAD"; then
    buildSpigotFromSource
  fi
else
  downloadSpigot
fi

JVM_OPTS="${JVM_OPTS} -DIReallyKnowWhatIAmDoingISwear"
export JVM_OPTS
# Normalize on Spigot for operations below
export FAMILY=SPIGOT

exec "$(dirname "$0")/start-spiget" "$@"
