#!/bin/bash

CDPATH=""

SCRIPT="$0"

# SCRIPT might be an arbitrarily deep series of symbolic links; loop until we
# have the concrete path
while [ -h "$SCRIPT" ] ; do
  ls=`ls -ld "$SCRIPT"`
  # Drop everything prior to ->
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    SCRIPT="$link"
  else
    SCRIPT=`dirname "$SCRIPT"`/"$link"
  fi
done

# determine ElasticSearch home; to do this, we strip from the path until we find
# bin, and then strip bin (there is an assumption here that there is no nested
# directory under bin also named bin)
ES_HOME=`dirname "$SCRIPT"`

# now make ES_HOME absolute
ES_HOME=`cd "$ES_HOME"; pwd`

while [ "`basename "$ES_HOME"`" != "bin" ]; do
  ES_HOME=`dirname "$ES_HOME"`
done
ES_HOME=`dirname "$ES_HOME"`


# ========= Fusionauth stuff =========== #
export FUSIONAUTH_PLUGIN_DIR=${ES_HOME}/../../plugins
export FUSIONAUTH_CONFIG_DIR=${ES_HOME}/../../config
export FUSIONAUTH_JAVA_DIR=${ES_HOME}/../../java
export FUSIONAUTH_LOG_DIR=${ES_HOME}/../../logs
export MARKER="fusionAuthSearchEngine87AFBG16"
ES_JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfusionauth.home.directory=${ES_HOME}/.. -Dfusionauth.config.directory=${FUSIONAUTH_CONFIG_DIR} -Dfusionauth.plugin.directory=${FUSIONAUTH_PLUGIN_DIR} -Djava.awt.headless=true -Dlog4j2.disable.jmx=true -D$MARKER"
ES_JAVA_OPTS=$(echo ${ES_JAVA_OPTS}|tr -d '\r')

if [ ! -d ${ES_HOME}/plugins ]; then
  mkdir -p ${ES_HOME}/plugins
fi

if [ ! -d ${ES_HOME}/logs ]; then
  mkdir -p ${ES_HOME}/logs
fi

if [ ! -d ${FUSIONAUTH_LOG_DIR} ]; then
  mkdir -p ${FUSIONAUTH_LOG_DIR}
fi

if [ ! -d ${FUSIONAUTH_CONFIG_DIR} ]; then
  mkdir -p ${FUSIONAUTH_CONFIG_DIR}
fi

if [ ! -d ${FUSIONAUTH_JAVA_DIR} ]; then
  mkdir -p ${FUSIONAUTH_JAVA_DIR}
fi

# Download Java if we are not yet setup, or the version is not the target version.
if [ "$(uname -s)" = "Darwin" ]; then
  JAVA_PATH=${FUSIONAUTH_JAVA_DIR}/jre1.8.0_171.jre
elif [ "$(uname -s)" = "Linux" ]; then
  JAVA_PATH=${FUSIONAUTH_JAVA_DIR}/jre1.8.0_171
fi

if [ ! -e ${FUSIONAUTH_JAVA_DIR}/current ] || [ ! -d ${JAVA_PATH} ]; then
  if [ "$(uname -s)" = "Darwin" ]; then
    if [ -d ~/.savant/cache/com/oracle/jre/1.8.0+u171/ ]; then
      cp ~/.savant/cache/com/oracle/jre/1.8.0+u171/jre-macos-1.8.0+u171.tar.gz ${FUSIONAUTH_JAVA_DIR}
    else
      wget -P ${FUSIONAUTH_JAVA_DIR} https://storage.googleapis.com/inversoft_products_j098230498/java/jre/jre-macos-1.8.0+u171.tar.gz
    fi
    tar xfz ${FUSIONAUTH_JAVA_DIR}/jre-macos-1.8.0+u171.tar.gz -C ${FUSIONAUTH_JAVA_DIR}
    cd ${FUSIONAUTH_JAVA_DIR}
    rm -f ./current
    ln -s ./jre1.8.0_171.jre current
    rm ./jre-macos-1.8.0+u171.tar.gz
  elif [ "$(uname -s)" = "Linux" ]; then
    wget -P ${FUSIONAUTH_JAVA_DIR} https://storage.googleapis.com/inversoft_products_j098230498/java/jre/jre-linux-1.8.0+u171.tar.gz
    tar xfz ${FUSIONAUTH_JAVA_DIR}/jre-linux-1.8.0+u171.tar.gz -C ${FUSIONAUTH_JAVA_DIR}
    cd ${FUSIONAUTH_JAVA_DIR}
    rm -f ./current
    ln -s ./jre1.8.0_171 current
    rm ./jre-linux-1.8.0+u171.tar.gz
  fi
fi

# Set JAVA_HOME on Mac OS and Linux, when starting via the service on Linux JAVA_HOME is not used.
if [ "$(uname -s)" = "Darwin" ]; then
  JAVA_HOME=${FUSIONAUTH_JAVA_DIR}/current/Home
elif [ "$(uname -s)" = "Linux" ]; then
  JAVA_HOME=${FUSIONAUTH_JAVA_DIR}/current
fi

if [ -f ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties ]; then
  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.http-port" | awk -F'=' '{ sub(/\r$/,""); print $2}')
  if [ ! -z "${FUSIONAUTHSEARCH_HTTP_PORT}" ]; then
    export ELASTICSEARCH_HTTP_PORT=${FUSIONAUTHSEARCH_HTTP_PORT}
  elif [ -n "${value}" ]; then
    export ELASTICSEARCH_HTTP_PORT=${value}
  else
    echo "Missing [fusionauth-search.http-port] configuration in the [fusionauth.properties] file."
    exit 1
  fi

  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.servers" | awk -F'=' '{ sub(/\r$/,""); print $2}')
  if [ ! -z "${FUSIONAUTHSEARCH_SERVERS}" ]; then
    export ELASTICSEARCH_SERVERS=${FUSIONAUTHSEARCH_SERVERS}
  elif [ -n "${value}" ]; then
    export ELASTICSEARCH_SERVERS=${value}
  else
    echo "Missing [fusionauth-search.servers] configuration in the [fusionauth.properties] file."
    exit 1
  fi

  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.hosts" | awk -F'=' '{ sub(/\r$/,""); print $2}')
  if [ ! -z "${FUSIONAUTHSEARCH_HOSTS}" ]; then
    export ELASTICSEARCH_NETWORK_HOSTS=${FUSIONAUTHSEARCH_HOSTS}
  elif [ -n "${value}" ]; then
    export ELASTICSEARCH_NETWORK_HOSTS=${value}
  else
    export ELASTICSEARCH_NETWORK_HOSTS=_local_
  fi

  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.transport-port" | awk -F'=' '{ sub(/\r$/,""); print $2}')
  if [ ! -z "${FUSIONAUTHSEARCH_TRANSPORT_PORT}" ]; then
    export ELASTICSEARCH_TRANSPORT_PORT=${FUSIONAUTHSEARCH_TRANSPORT_PORT}
  elif [ -n "${value}" ]; then
    export ELASTICSEARCH_TRANSPORT_PORT=${value}
  else
    echo "Missing [fusionauth-search.transport-port] configuration in the [fusionauth.properties] file."
    exit 1
  fi

  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.memory" | awk -F'=' '{ sub(/\r$/,""); print $2}')
  if [ ! -z "${FUSIONAUTHSEARCH_MEMORY}" ]; then
    ES_JAVA_OPTS="$ES_JAVA_OPTS -Xms$FUSIONAUTHSEARCH_MEMORY -Xmx$FUSIONAUTHSEARCH_MEMORY"
  elif [ -n "$value" ]; then
    ES_JAVA_OPTS="$ES_JAVA_OPTS -Xms$value -Xmx$value"
  fi

  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.data-directory" | awk -F'=' '{ sub(/\r$/,""); print $2}')
  if [ ! -z "${FUSIONAUTHSEARCH_DATA_DIRECTORY}" ]; then
    export ELASTICSEARCH_DATA_DIRECTORY=${FUSIONAUTHSEARCH_DATA_DIRECTORY}
  elif [ -n "${value}" ]; then
    export ELASTICSEARCH_DATA_DIRECTORY=${value}
  else
    # Default directory to ../../data/search/esv<major version> for index compatibility
    export ELASTICSEARCH_DATA_DIRECTORY=${ES_HOME}/../../data/search/esv6
  fi

  value=$(cat ${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties | grep "^fusionauth-search.additional-java-args" | sed 's/^[a-zA-Z.-]*=//' | awk '{ sub(/\r$/,""); print }')
  if [ ! -z "${FUSIONAUTHSEARCH_ADDITIONAL_JAVA_ARGS}" ]; then
   ES_JAVA_OPTS="$ES_JAVA_OPTS $FUSIONAUTHSEARCH_ADDITIONAL_JAVA_ARGS"
  elif [ -n "$value" ]; then
    ES_JAVA_OPTS="$ES_JAVA_OPTS $value"
  fi
fi

if [ ! -d ${ELASTICSEARCH_DATA_DIRECTORY} ]; then
  mkdir -p ${ELASTICSEARCH_DATA_DIRECTORY}
fi

# ======= End FusionAuth Stuff ======= #

# now set the classpath
ES_CLASSPATH="$ES_HOME/lib/*"

# now set the path to java
if [ -x "$JAVA_HOME/bin/java" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  set +e
  JAVA=`which java`
  set -e
fi

if [ ! -x "$JAVA" ]; then
  echo "could not find java; set JAVA_HOME or ensure java is in PATH"
  exit 1
fi

# do not let JAVA_TOOL_OPTIONS slip in (as the JVM does by default)
if [ ! -z "$JAVA_TOOL_OPTIONS" ]; then
  echo "warning: ignoring JAVA_TOOL_OPTIONS=$JAVA_TOOL_OPTIONS"
  unset JAVA_TOOL_OPTIONS
fi

# JAVA_OPTS is not a built-in JVM mechanism but some people think it is so we
# warn them that we are not observing the value of $JAVA_OPTS
if [ ! -z "$JAVA_OPTS" ]; then
  echo -n "warning: ignoring JAVA_OPTS=$JAVA_OPTS; "
  echo "pass JVM parameters via ES_JAVA_OPTS"
fi

# check the Java version
"$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.launchers.JavaVersionChecker

export HOSTNAME=$HOSTNAME

if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; fi

if [ -z "$ES_PATH_CONF" ]; then
  echo "ES_PATH_CONF must be set to the configuration path"
  exit 1
fi

# now make ES_PATH_CONF absolute
ES_PATH_CONF=`cd "$ES_PATH_CONF"; pwd`

ES_DISTRIBUTION_FLAVOR=default
ES_DISTRIBUTION_TYPE=tar

if [ -z "$ES_TMPDIR" ]; then
  set +e
  mktemp --version 2>&1 | grep coreutils > /dev/null
  mktemp_coreutils=$?
  set -e
  if [ $mktemp_coreutils -eq 0 ]; then
    ES_TMPDIR=`mktemp -d --tmpdir "elasticsearch.XXXXXXXX"`
  else
    ES_TMPDIR=`mktemp -d -t elasticsearch`
  fi
fi
