#!/bin/bash

set -e

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:+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


downloadJava() {
  JAVA_VERSION=14.0.1+7
  BASE_URL_PATH=https://files.fusionauth.io/java/openjdk

  # Ensure both the 'current' and 'jdk-${JAVA_VERSION}' exist, this tells us Java is setup and at the correct version
  if [ ! -e "${FUSIONAUTH_JAVA_DIR}/current" ] || [ ! -d "${FUSIONAUTH_JAVA_DIR}/jdk-${JAVA_VERSION}" ]; 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} "${BASE_URL_PATH}/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} "${BASE_URL_PATH}/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
}

appendToVariable() {
  local varName=$1
  local value=$2
  if [ -n "${!varName}" ]; then
    export "${varName}"="${!varName} ${value}"
  else
    export "${varName}"="${value}"
  fi
}

# Arguments are: (envVarName, cmdOption, oldName, newName, oldEnvName, newEnvName, default)
resolveConfigurationProperty() {
  local envVarName=$1
  local cmdOption=$2
  local oldName=$3
  local newName=$4
  local oldEnvName=$5
  local newEnvName=$6
  local default=$7

  if [ -n "${!newEnvName}" ]; then
    appendToVariable "${envVarName}" "${cmdOption}${!newEnvName}"
    return
  elif [ -n "${!oldEnvName}" ]; then
    echo "You are using a deprecated environment variable of [${oldEnvName}]. The new variable name is [${newEnvName}]"
    appendToVariable "${envVarName}" "${cmdOption}${!oldEnvName}"
    return
  elif [ -f "${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties" ]; then
    if [ -n "${newName}" ]; then
      newValue=$(grep "^${newName//[.]/\.}" "${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties" | tr -d '\r' | cut -d'=' -f2-)
      if [ -n "${newValue}" ]; then
        appendToVariable "${envVarName}" "${cmdOption}${newValue}"
        return
      fi
    fi
    if [ -n "${oldName}" ]; then
      oldValue=$(grep "^${oldName//[.]/\.}" "${FUSIONAUTH_CONFIG_DIR}/fusionauth.properties" | tr -d '\r' | cut -d'=' -f2-)
      if [ -n "${oldValue}" ]; then
        echo "You are using a deprecated configuration property of [${oldName}] in [fusionauth.properties]. The new variable name is [${newName}]"
        appendToVariable "${envVarName}" "${cmdOption}${oldValue}"
        return
      fi
    fi
  fi

  if [ -n "${default}" ]; then
    appendToVariable "${envVarName}" "${cmdOption}${default}"
  fi
}

if [ "$FUSIONAUTH_USE_GLOBAL_JAVA" != "1" ]; then
  # Download Java if necessary
  downloadJava

  # Set JAVA_HOME
  JAVA_HOME=${FUSIONAUTH_JAVA_DIR}/current
fi

resolveConfigurationProperty ELASTICSEARCH_HTTP_PORT "" fusionauth-search.http-port fusionauth-search.http.port FUSIONAUTHSEARCH_HTTP_PORT FUSIONAUTH_SEARCH_HTTP_PORT
resolveConfigurationProperty ELASTICSEARCH_NETWORK_HOSTS "" "" fusionauth-search.hosts FUSIONAUTHSEARCH_HOSTS FUSIONAUTH_SEARCH_HOSTS _local_
resolveConfigurationProperty ELASTICSEARCH_TRANSPORT_PORT "" fusionauth-search.transport-port fusionauth-search.transport.port FUSIONAUTHSEARCH_TRANSPORT_PORT FUSIONAUTH_SEARCH_TRANSPORT_PORT
resolveConfigurationProperty ES_JAVA_OPTS -Xmx "" fusionauth-search.memory FUSIONAUTHSEARCH_MEMORY FUSIONAUTH_SEARCH_MEMORY
resolveConfigurationProperty ES_JAVA_OPTS -Xms "" fusionauth-search.memory FUSIONAUTHSEARCH_MEMORY FUSIONAUTH_SEARCH_MEMORY
resolveConfigurationProperty ELASTICSEARCH_DATA_DIRECTORY "" "" fusionauth-search.data-directory FUSIONAUTHSEARCH_DATA_DIRECTORY FUSIONAUTH_SEARCH_DATA_DIRECTORY ${ES_HOME}/../../data/search/esv6
resolveConfigurationProperty ES_JAVA_OPTS "" "" fusionauth-search.additional-java-args FUSIONAUTHSEARCH_ADDITIONAL_JAVA_ARGS FUSIONAUTH_SEARCH_ADDITIONAL_JAVA_ARGS

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"
