#!/usr/bin/env bash

function cd_or_die() {
  cd "$1" || (echo "Can't cd to $1" >&2; exit 3)
}

# Limit virtual memory on docker
export MALLOC_ARENA_MAX=4

CURDIR="${PWD}"

#REALPATH=$(readlink -f $0)
#LOCATION=$(dirname "$REALPATH")

#readlink -f does not work on mac, use alternate script
TARGET_FILE=$0

cd_or_die "$(dirname "${TARGET_FILE}")"
TARGET_FILE="$(basename "${TARGET_FILE}")"

# Iterate down a (possible) chain of symlinks
while [ -L "${TARGET_FILE}" ]
do
    TARGET_FILE="$(readlink "${TARGET_FILE}")"
    cd_or_die "$(dirname "${TARGET_FILE}")"
    TARGET_FILE="$(basename "${TARGET_FILE}")"
done

REALPATH=$TARGET_FILE
#end of readlink -f

LOCATION=$( cd_or_die "$(dirname "${REALPATH}")" ; pwd -P )
cd_or_die "$CURDIR"

MEM=${OPENMOLE_MEMORY:-"2G"}
# enable through command line arguments --debug and --debug-port
DEBUG_MODE=false
DEBUG_PORT=5005
FLAGS=()

JAVA="java"
if [ ! -z ${JAVA_HOME} ]
then
  # the environment variable is defined
  if [ -e ${JAVA_HOME}/bin/java ]
  then
      # and this folder does exist
      #echo "using java ${JAVA_HOME}/bin/java"
      JAVA="${JAVA_HOME}/bin/java"
  else
      echo "wrong java home ${JAVA_HOME}; falling back to 'java'"
  fi
fi

JAVAVERSION=$($JAVA -version 2>&1)

JVMFLAVOR=$(echo "$JAVAVERSION" | tail -1)
case "$JVMFLAVOR" in
  *64-Bit*) FLAGS+=("-XX:+UseCompressedOops");;
esac

JVMVERSION=$(echo "$JAVAVERSION" | grep version | rev | cut -d' ' -f1 | rev)
case "$JVMVERSION" in
  *1\.6\.*) echo "Your java version is too old ($JAVAVERSION). You can use $JAVA_HOME to use a more recent Java."; exit 1;;
  *1\.7\.*) FLAGS+=("-XX:MaxPermSize=128M");;
esac

WORKSPACE="${HOME}/.openmole"

ARGS=()
SCRIPT_ARGS=()

function usage() {
cat <<EOF
OpenMOLE launch script options:
  -d   --debug          Enable remote debugging (for developers)
  -h   --help           Show this message
  -m   --mem            Set OpenMOLE application's memory (default: --mem ${MEM})
  -p   --debug-port     Set port for remote debugging (default: --debug-port ${DEBUG_PORT})

EOF
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    debug ) DEBUG_MODE=true ;;
    h|--help ) usage ; ARGS+=("--help") ;;
    m|--mem ) MEM="$2" ; shift ;;
    --debug-port ) DEBUG_PORT="$2"; shift ;;
    w|--workspace ) WORKSPACE="$2"; shift ; ARGS+=("--workspace"); ARGS+=("${WORKSPACE}") ;;
    * ) ARGS+=("$1");;
  esac
  shift 
done

if [ ${DEBUG_MODE} == true ]; then
  FLAGS+=("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${DEBUG_PORT}")
fi

# Try to increase the max number of opened files
if [[ $(ulimit -S -n) -lt 4096 ]]; then ulimit -S -n 4096 2>/dev/null; fi

function run {
  mkdir -p "${WORKSPACE}/.tmp/"
  CONFIGDIR=${WORKSPACE}/.tmp/`date +%s`_$RANDOM

  $JAVA -Xss8M -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Duser.country=US -Duser.language=en -Djava.security.egd=file:/dev/./urandom -Dopenmole.location="${LOCATION}" -Dosgi.classloader.singleThreadLoads=true -Dosgi.configuration.area="${CONFIGDIR}" "-Xmx${MEM}" "${FLAGS[@]}" \
     -XX:+UseG1GC -XX:CICompilerCount=2 -XX:ParallelGCThreads=2 -XX:ConcGCThreads=2 -XX:G1ConcRefinementThreads=2 -XX:+UseStringDeduplication \
     --add-opens java.base/java.lang.invoke=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED \
     -cp "${LOCATION}/launcher/*" org.openmole.launcher.Launcher  --plugins "${LOCATION}/plugins/" --priority "logging" --run org.openmole.ui.Application --osgi-directory "${CONFIGDIR}" --osgi-locking-none -- \
     "${ARGS[@]}" "${SCRIPT_ARGS[@]}"

  RET=$?
  rm -rf "${CONFIGDIR}"
}

run
while [[ $RET -eq 254 ]]; do
 SCRIPT_ARGS=("--no-browser")
 run
done

exit $RET
