#!/usr/bin/env bash

# verbose
#set -x

set -o pipefail
shopt -s failglob
set -u

log () {
  echo "steamcmd.sh[$$]: $*" >&2 || :
}

STEAMROOT="$(cd "$(dirname "$0")" && echo "$PWD")"
if [ -z "${STEAMROOT}" ]; then
  log "Couldn't find Steam root directory from $0, exiting!"
  exit 1
fi
STEAMCMD=$(basename "$0" .sh)

UNAME=$(uname)
if [ "$UNAME" == "Linux" ]; then
  : "${STEAM_PLATFORM:=linux32}"
  export LD_LIBRARY_PATH="$STEAMROOT/$STEAM_PLATFORM:${LD_LIBRARY_PATH-}"

  STEAMEXE="${STEAMROOT}/$STEAM_PLATFORM/${STEAMCMD}"
elif [ "$UNAME" == "Darwin" ]; then
  export DYLD_LIBRARY_PATH="$STEAMROOT:${DYLD_LIBRARY_PATH-}"
  export DYLD_FRAMEWORK_PATH="$STEAMROOT:${DYLD_FRAMEWORK_PATH-}"

  STEAMEXE="${STEAMROOT}/${STEAMCMD}"
  if [ ! -x "${STEAMEXE}" ]; then
    STEAMEXE="${STEAMROOT}/Steam.AppBundle/Steam/Contents/MacOS/${STEAMCMD}"
  fi
else
  log "Unknown system type $UNAME, exiting"
  exit 1
fi

if [ ! -e "$STEAMEXE" ]; then
  log "Couldn't find steamcmd at $STEAMEXE, exiting"
  exit 1
fi

MAGIC_RESTART_EXITCODE=42

: "${DEBUGGER=}"
if [ "$DEBUGGER" == "gdb" ] || [ "$DEBUGGER" == "cgdb" ]; then
  ARGSFILE=$(mktemp "$USER.steam.gdb.XXXX")

  # Set the LD_PRELOAD varname in the debugger, and unset the global version.
  : "${LD_PRELOAD=}"
  if [ "$LD_PRELOAD" ]; then
    echo "set env LD_PRELOAD=$LD_PRELOAD" >> "$ARGSFILE"
    echo "show env LD_PRELOAD" >> "$ARGSFILE"
    unset LD_PRELOAD
  fi

  # Ditto with LD_LIBRARY_PATH, avoids this below:
  # gdb: /home/plagman/src/valve/Steam/main/client/ubuntu12_32/steam-runtime/pinned_libs_64/libcurl.so.4: version `CURL_OPENSSL_4' not found (required by /usr/lib/libdebuginfod.so.1)
  : "${LD_LIBRARY_PATH=}"
  if [ "$LD_LIBRARY_PATH" ]; then
    echo "set env LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> "$ARGSFILE"
    echo "show env LD_LIBRARY_PATH" >> "$ARGSFILE"
    unset LD_LIBRARY_PATH
  fi

  # Enable index file caching for reasonable launch time under gdb
  echo set index-cache enabled on >> "$ARGSFILE"
  echo show index-cache stats >> "$ARGSFILE"

  : "${DEBUGGER_ARGS=}"
  log "gdb/cgdb launch with ARGSFILE: $ARGSFILE"

  log Starting "$DEBUGGER" -x "$ARGSFILE" "$DEBUGGER_ARGS" --args "$STEAMEXE" "$@"
  $DEBUGGER -x "$ARGSFILE" "$DEBUGGER_ARGS" --args "$STEAMEXE" "$@"

  rm "$ARGSFILE"
else
  log Starting "$DEBUGGER" "$STEAMEXE"
  $DEBUGGER "$STEAMEXE" "$@"
fi

STATUS=$?

if [ $STATUS -eq $MAGIC_RESTART_EXITCODE ]; then
  log "Restarting steamcmd by request..."
  exec "$0" "$@"
fi
exit $STATUS
