#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# shellcheck source=start-utils
. "${SCRIPTS:-/}start-utils"

: "${EULA:=}"
: "${PROXY:=}"
: "${ENABLE_AUTOPAUSE:=false}"
: "${ENABLE_AUTOSTOP:=false}"
: "${RCON_CMDS_STARTUP:=}"
: "${RCON_CMDS_ON_CONNECT:=}"
: "${RCON_CMDS_ON_DISCONNECT:=}"
: "${RCON_CMDS_FIRST_CONNECT:=}"
: "${RCON_CMDS_LAST_DISCONNECT:=}"
: "${RCON_CMDS_PERIOD:=10}"
: "${RCON_PASSWORD_FILE:=}"
: "${RCON_PASSWORD:=minecraft}"
: "${RCON_PORT:=25575}"
export RCON_PASSWORD RCON_PORT

shopt -s nullglob

isDebugging && set -x

#umask 002
export HOME=/data

log "Running as uid=$(id -u) gid=$(id -g) with /data as '$(ls -lnd /data)'"

if [ ! -e /data/eula.txt ]; then
  if ! isTrue "$EULA"; then
    log ""
    log "Please accept the Minecraft EULA at"
    log "  https://account.mojang.com/documents/minecraft_eula"
    log "by adding the following immediately after 'docker run':"
    log "  -e EULA=TRUE"
    log ""
    exit 1
  fi

  writeEula
fi

if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${EXEC_DIRECTLY:-false}"; then
    log "EXEC_DIRECTLY=true is incompatible with ENABLE_AUTOPAUSE=true"
    exit 1
fi

if isTrue "${ENABLE_AUTOPAUSE}" && isTrue "${ENABLE_AUTOSTOP}"; then
    log "ENABLE_AUTOPAUSE=true is incompatible with ENABLE_AUTOSTOP=true"
    exit 1
fi

if [[ $PROXY ]]; then
    export http_proxy="$PROXY"
    export https_proxy="$PROXY"
    export JAVA_TOOL_OPTIONS+="-Djava.net.useSystemProxies=true"
    log "INFO: Giving proxy time to startup..."
    sleep 5
fi

if [[ $RCON_PASSWORD_FILE ]]; then
    log ""
    if [ ! -e ${RCON_PASSWORD_FILE} ]; then
	log "Initial RCON password file ${RCON_PASSWORD_FILE} does not seems to exist."
	log "Please ensure your configuration."
	log "If you are using Docker Secrets feature, please check this for further information: "
	log " https://docs.docker.com/engine/swarm/secrets"
	log ""
	exit 1
    else
	RCON_PASSWORD=$(cat ${RCON_PASSWORD_FILE})
	export RCON_PASSWORD
    fi
    log ""
fi

function fixJavaPath() {
  # Some Docker management UIs grab all the image declared variables and present them for configuration.
  # When upgrading images across Java versions, that creates a mismatch in PATH's expected by base image.
  if ! which java > /dev/null; then
    log "ERROR: your Docker provider has an annoying flaw where it"
    log "       tries to set PATH even though the container establishes"
    log "       a very specific value."
    sleep 2
    # now find where java might be
    for d in /opt/java/openjdk/bin /usr/bin; do
      if [ -x "${d}/java" ]; then
        PATH="${PATH}:${d}"
        return 0
      fi
    done
    return 1
  fi
}

if ! fixJavaPath; then
  log "ERROR: could not locate path that contains java"
  exit 1
fi

export VERSIONS_JSON=https://launchermeta.mojang.com/mc/game/version_manifest.json

case "X$VERSION" in
  X|XLATEST|Xlatest)
    if ! VANILLA_VERSION=$(get --json-path '$.latest.release' "$VERSIONS_JSON"); then
      log "ERROR: version lookup failed: $VANILLA_VERSION"
      exit 1
    fi
  ;;
  XSNAPSHOT|Xsnapshot)
    if ! VANILLA_VERSION=$(get --json-path '$.latest.snapshot' "$VERSIONS_JSON"); then
      log "ERROR: version lookup failed: $VANILLA_VERSION"
      exit 1
    fi
  ;;
  *)
    VANILLA_VERSION=$VERSION
  ;;
esac
export VANILLA_VERSION
MAJOR_VANILLA_VERSION=$(get_major_version "$VANILLA_VERSION")
export MAJOR_VANILLA_VERSION
log "Resolved version given ${VERSION} into ${VANILLA_VERSION} and major version ${MAJOR_VANILLA_VERSION}"

cd /data || exit 1

export ORIGINAL_TYPE=${TYPE^^}

if isTrue "${ENABLE_AUTOPAUSE}"; then
  ${SCRIPTS:-/}start-autopause
fi

if isTrue "${ENABLE_AUTOSTOP}"; then
  ${SCRIPTS:-/}start-autostop
fi

if 
  [[ "$RCON_CMDS_STARTUP" ]] ||
  [[ "$RCON_CMDS_ON_CONNECT" ]] ||
  [[ "$RCON_CMDS_ON_DISCONNECT" ]] || 
  [[ "$RCON_CMDS_FIRST_CONNECT" ]] || 
  [[ "$RCON_CMDS_LAST_DISCONNECT" ]]
then
  log "Starting RCON commands"
  # shellcheck source=start-rconcmds
  ${SCRIPTS:-/}start-rconcmds
fi

if versionLessThan 1.7; then
  echo "
MC_HEALTH_EXTRA_ARGS=(
  --use-server-list-ping
)
  " > /data/.mc-health.env
fi

log "Resolving type given ${TYPE}"
case "${TYPE^^}" in
  *BUKKIT|SPIGOT)
    exec "${SCRIPTS:-/}start-deployBukkitSpigot" "$@"
  ;;

  PAPER)
    exec "${SCRIPTS:-/}start-deployPaper" "$@"
  ;;

  FORGE)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployForge" "$@"
  ;;

  FABRIC)
    exec "${SCRIPTS:-/}start-deployFabric" "$@"
  ;;

  QUILT)
    exec "${SCRIPTS:-/}start-deployQuilt" "$@"
  ;;
  
  FTBA)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployFTBA" "$@"
  ;;

  FTB|CURSEFORGE)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployCF" "$@"
  ;;

  VANILLA)
    exec "${SCRIPTS:-/}start-deployVanilla" "$@"
  ;;

  SPONGEVANILLA)
    exec "${SCRIPTS:-/}start-deploySpongeVanilla" "$@"
  ;;

  CUSTOM)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployCustom" "$@"
  ;;

  MAGMA)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployMagma" "$@"
  ;;

  MOHIST)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployMohist" "$@"
  ;;

  CATSERVER)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployCatserver" "$@"
  ;;

  LOLISERVER)
    evaluateJavaCompatibilityForForge
    exec "${SCRIPTS:-/}start-deployLoliserver" "$@"
  ;;

  PURPUR)
    exec "${SCRIPTS:-/}start-deployPurpur" "$@"
  ;;

  PUFFERFISH)
    exec "${SCRIPTS:-/}start-deployPufferfish" "$@"
  ;;

  CANYON)
    exec "${SCRIPTS:-/}start-deployCanyon" "$@"
  ;;

  LIMBO)
    exec "${SCRIPTS:-/}start-deployLimbo" "$@"
  ;;

  CRUCIBLE)
    log "**********************************************************************"
    log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
    log "         since some mods require Java 8"
    log "         Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
    log "         can be fixed with java8"
    log "**********************************************************************"
    exec "${SCRIPTS:-/}start-deployCrucible" "$@"
  ;;

  *)
      log "Invalid type: '$TYPE'"
      log "Must be: VANILLA, FORGE, BUKKIT, SPIGOT, PAPER, FTBA (multiarch-only),"
      log "         CURSEFORGE, SPONGEVANILLA, PURPUR, CUSTOM,"
      log "         MAGMA, MOHIST, CATSERVER, LOLISERVER, AIRPLANE, PUFFERFISH, CANYON, LIMBO, CRUCIBLE"
      exit 1
  ;;

esac
