#!/bin/bash

set -e -o pipefail

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')

CURL_OPTS="-fSL --progress-bar"
# If we are in a non interactive shell then hide the progress but show errors
if ! tty -s; then
  CURL_OPTS="-sSfL"
fi

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.
JAVA_VERSION=14.0.1+7
if [ "$(uname -s)" = "Darwin" ]; then
  JAVA_PATH=${FUSIONAUTH_JAVA_DIR}/jdk-${JAVA_VERSION}/Contents
elif [ "$(uname -s)" = "Linux" ]; then
  JAVA_PATH=${FUSIONAUTH_JAVA_DIR}/jdk-${JAVA_VERSION}
fi

if [ ! -e ${FUSIONAUTH_JAVA_DIR}/current ] || [ ! -d ${JAVA_PATH} ]; then
  if [ "$(uname -s)" = "Darwin" ]; then
    if [ -e ~/dev/java/current14 ]; then
      # Development, just sym link to our current version of Java, because only 'current' will exist in dev, we'll always rebuild the symlink.
      cd ${FUSIONAUTH_JAVA_DIR}
      rm -f current
      ln -s ~/dev/java/current14 current
    else
      curl ${CURL_OPTS} https://files.fusionauth.io/java/openjdk/openjdk-macos-${JAVA_VERSION}.tar.gz -o ${FUSIONAUTH_JAVA_DIR}/openjdk-macos-${JAVA_VERSION}.tar.gz
      tar xfz ${FUSIONAUTH_JAVA_DIR}/openjdk-macos-${JAVA_VERSION}.tar.gz -C ${FUSIONAUTH_JAVA_DIR}
      cd ${FUSIONAUTH_JAVA_DIR}
      rm -f current
      ln -s jdk-${JAVA_VERSION}/Contents/Home current
      rm openjdk-macos-${JAVA_VERSION}.tar.gz
    fi
  elif [ "$(uname -s)" = "Linux" ]; then
    curl ${CURL_OPTS} https://files.fusionauth.io/java/openjdk/openjdk-linux-${JAVA_VERSION}.tar.gz -o ${FUSIONAUTH_JAVA_DIR}/openjdk-linux-${JAVA_VERSION}.tar.gz
    tar xfz ${FUSIONAUTH_JAVA_DIR}/openjdk-linux-${JAVA_VERSION}.tar.gz -C ${FUSIONAUTH_JAVA_DIR}
    cd ${FUSIONAUTH_JAVA_DIR}
    rm -f current
    ln -s jdk-${JAVA_VERSION} current
    rm openjdk-linux-${JAVA_VERSION}.tar.gz
  fi
fi

JAVA_HOME=${FUSIONAUTH_JAVA_DIR}/current

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
    # - Leave at esv6 because we are still compatible, this will allow for a seamless migration.
    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, we expect JAVA_HOME to already be defined
JAVA="$JAVA_HOME/bin/java"
JAVA_TYPE="JAVA_HOME"

if [ ! -x "$JAVA" ]; then
  echo "could not find java in $JAVA_TYPE at $JAVA" >&2
  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, we ship our own JAVA, no need to check
# "$JAVA" -cp "$ES_CLASSPATH" org.elasticsearch.tools.java_version_checker.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=oss
ES_DISTRIBUTION_TYPE=tar
ES_BUNDLED_JDK=false

cd "$ES_HOME"