#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# Configurable values
AWS_REGION="${AWS_REGION:-us-west-2}"   # may be overridden by environment variable
GAMELIFT_SDK_DATE="02_15_2018"
GAMELIFT_LOCAL_VERSION="1.0.3"

# Do not change
GAMELIFT_SDK_URL="https://s3-$AWS_REGION.amazonaws.com/gamelift-release/GameLift_$GAMELIFT_SDK_DATE.zip"
ZIP_FILENAME_EXTENSION="$(basename "$GAMELIFT_SDK_URL")"                                # => GameLift_02_15_2018.zip
ZIP_FILENAME_ONLY="${ZIP_FILENAME_EXTENSION%.*}"                                        # => GameLift_02_15_2018
GAMELIFT_LOCAL_DIRECTORY="GameLiftLocal-Release-$GAMELIFT_LOCAL_VERSION"                # => GameLiftLocal-Release-1.0.3
SDK_DIR="$SCRIPT_DIR/../sdks"                                                           # => ../sdks
GAMELIFT_LOCAL_SDK_DIRECTORY="$SDK_DIR/$ZIP_FILENAME_ONLY/$GAMELIFT_LOCAL_DIRECTORY"    # => ../sdks/GameLift_02_15_2018/GameLiftLocal-Release-1.0.3
GAMELIFTLOCAL_JAR="$GAMELIFT_LOCAL_SDK_DIRECTORY/GameLiftLocal.jar"

# Install GameLift SDK if required
mkdir -p "$GAMELIFT_LOCAL_SDK_DIRECTORY"
if [[ ! -f "$GAMELIFTLOCAL_JAR" ]]; then
    ZIP_TEMPNAME="$(mktemp -d)/$ZIP_FILENAME_EXTENSION" # => /tmp/GameLift_02_15_2018.zip

    # Download zip file if necessary
    [[ -f "$ZIP_TEMPNAME" ]] || curl -L "$GAMELIFT_SDK_URL" -o "$ZIP_TEMPNAME"

    # Unzip only the part we want ("local")
    unzip -quo "$ZIP_TEMPNAME" -d "$SDK_DIR"
fi

# Exit handler
function on_exit () {
    [[ -z "${NODE_PID:-}" ]] || kill -9 "$NODE_PID" 2>/dev/null || true
    [[ -z "${JAVA_PID:-}" ]] || kill -9 "$JAVA_PID" 2>/dev/null || true
}
trap "on_exit" INT TERM ERR EXIT

# Run GameLiftLocal in a background process.
# - output of game server and java will be intermixed unless you add ">/dev/null 2>&1"
java -jar "$GAMELIFTLOCAL_JAR" &
JAVA_PID=$!

# Run the game server unless RUN_JAVA_ONLY is set (useful for debugging node app separately)
if [[ "${RUN_JAVA_ONLY:-}" != "true" ]]; then
    node -- "$SCRIPT_DIR/../src/gamelift.js" --client-required "$@" &
    NODE_PID=$!
fi

case "$OSTYPE" in
    darwin*)
        # OSX does not support the wait "-n" flag which waits for any one process to terminate
        WAIT_FLAGS=
    ;;
    *)
        # Using the wait "-n" (wait for next job to terminate) we can wait until any one
        # application stops and then exit this script, enabling the on_exit trap to
        # clean up the other application.
        WAIT_FLAGS="-n"
    ;;
esac

wait "$WAIT_FLAGS" $JAVA_PID ${NODE_PID:-}
