#!/bin/sh -e

set -e

APPCONF=""
JAVAOPT=""

add_javaopt() {
  if [ -n "$2" ]
  then
    if [ -n "$JAVAOPT" ]
    then
      JAVAOPT="$JAVAOPT\n"
    fi

    JAVAOPT="$JAVAOPT$1$2"
  fi
}

add_appconf() {
  cfgName="$1"
  cfgValue="$2"

  if [ -n "$cfgValue" ]
  then
    if [ -n "$APPCONF" ]
    then
      APPCONF="$APPCONF\n"
    fi

    shift
    shift

    APPCONF="$APPCONF$cfgName$cfgValue$*"
  fi
}

enclose_quotes() {
  if [ -n "$1" ]
  then
    echo "\"$1\""
  fi
}

get_conf() {
  val=$(snapctl get "$1")

  if [ -n "$val" ]
  then
    echo "$val"
  elif [ -n "$2" ]
  then
    snapctl set "$1=$2"
    echo "$2"
  else
    snapctl unset "$1"
  fi
}

#################################################
################### APPs CONF ###################
#################################################

add_appconf "play.application.loader = " "$(enclose_quotes "AppLoader")"
add_appconf "play.filters.cors.allowedOrigins = " "null"
add_appconf "play.filters.enabled = " "[]"
add_appconf "play.filters.enabled += " "$(enclose_quotes "play.filters.headers.SecurityHeadersFilter")"
add_appconf "play.filters.enabled += " "$(enclose_quotes "play.filters.cors.CORSFilter")"
add_appconf "play.assets.path = " "$(enclose_quotes "/public")"
add_appconf "play.assets.urlPrefix = " "$(enclose_quotes "/")"

AUTO_CONNECT_CONNECTION_ID="$(get_conf "zoonavigator.auto-connect.connection-id")"

# Validate auto connect configuration
if [ -n "$AUTO_CONNECT_CONNECTION_ID" ]
then
  CONNECTION_CFG_NAME="zoonavigator.connection.${AUTO_CONNECT_CONNECTION_ID}.connection-string"

  if [ -z "$(get_conf "$CONNECTION_CFG_NAME")" ]
  then
    >&2 echo "Invalid Auto Connect configuration: connection '${AUTO_CONNECT_CONNECTION_ID}' not properly defined."
    >&2 echo "Make sure following configuration option is set: ${CONNECTION_CFG_NAME}"
    exit 1;
  fi

  add_appconf "zoonavigator.autoConnect = " "$(enclose_quotes "$AUTO_CONNECT_CONNECTION_ID")"
fi

add_appconf "zoonavigator.requestTimeout = " "$(get_conf "zoonavigator.request.timeout" "10000")" " milliseconds"
add_appconf "play.http.parser.maxMemoryBuffer = " "$(get_conf "zoonavigator.request.max-size" "10000")" "k"
add_appconf "zoonavigator.connections = " "{}"

for connectionId in $(snapctl get -d zoonavigator | jq -r ".zoonavigator.connection|keys?|.[]")
do
  add_appconf "zoonavigator.connections.${connectionId}.name = " "$(enclose_quotes $(get_conf "zoonavigator.connection.${connectionId}.name"))"
  add_appconf "zoonavigator.connections.${connectionId}.conn = " "$(enclose_quotes $(get_conf "zoonavigator.connection.${connectionId}.connection-string"))"
  add_appconf "zoonavigator.connections.${connectionId}.auth = " "[]"

  for authId in $(snapctl get -d zoonavigator | jq -r ".zoonavigator.connection.${connectionId}.auth|keys?|.[]")
  do
    SCHEME_NAME_CFG_NAME="zoonavigator.connection.${connectionId}.auth.${authId}.scheme"
    SCHEME_ID_CFG_NAME="zoonavigator.connection.${connectionId}.auth.${authId}.id"

    SCHEME_NAME="$(get_conf "$SCHEME_NAME_CFG_NAME")"
    SCHEME_ID="$(get_conf "$SCHEME_ID_CFG_NAME")"

    # Validate auth config
    if [ -z "${SCHEME_NAME}" -o -z "${SCHEME_ID}" ]
    then
      >&2 echo "Invalid Auth '${authId}' configuration in Connection '${connectionId}'."
      >&2 echo "Make sure following configuration options are set: $SCHEME_NAME_CFG_NAME $SCHEME_ID_CFG_NAME"
      exit 1;
    fi

    add_appconf "zoonavigator.connections.${connectionId}.auths.${authId}.scheme = " "$(enclose_quotes "$SCHEME_NAME")"
    add_appconf "zoonavigator.connections.${connectionId}.auths.${authId}.id = " "$(enclose_quotes "$SCHEME_ID")"

    add_appconf "zoonavigator.connections.${connectionId}.auth = " "\${zoonavigator.connections.${connectionId}.auth} [\${zoonavigator.connections.${connectionId}.auths.${authId}}]"
  done
done

#################################################
################### JAVA OPTS ###################
#################################################

# Options
add_javaopt "-Dplay.http.context=" "$(get_conf "zoonavigator.base-href" "/")"

add_javaopt "-Dplay.server.http.port=" "$(get_conf "zoonavigator.server.http.port" "9000")"
add_javaopt "-Dplay.server.https.port=" "$(get_conf "zoonavigator.server.https.port")"
add_javaopt "-Dplay.server.https.keyStore.path=" "$(get_conf "zoonavigator.server.https.key-store.path")"
add_javaopt "-Dplay.server.https.keyStore.password=" "$(get_conf "zoonavigator.server.https.key-store.password")"
add_javaopt "-Dplay.server.https.keyStore.type=" "$(get_conf "zoonavigator.server.https.key-store.type")"

add_javaopt "-Xmx=" "$(get_conf "java.xmx")"
add_javaopt "-Xms=" "$(get_conf "java.xms")"
add_javaopt "-Djava.security.auth.login.config=" "$(get_conf "java.security.auth.login.config")"
add_javaopt "-Dsun.security.krb5.debug=" "$(get_conf "java.security.krb5.debug")"
add_javaopt "-Djava.security.krb5.realm=" "$(get_conf "java.security.krb5.realm")"
add_javaopt "-Djava.security.krb5.kdc=" "$(get_conf "java.security.krb5.kdc")"

add_javaopt "-Dzookeeper.client.maxAge=" "$(get_conf "zookeeper.client.max-age" "5000")"
add_javaopt "-Dzookeeper.client.connectTimeout=" "$(get_conf "zookeeper.client.connect-timeout" "5000")"
add_javaopt "-Dzookeeper.sasl.client=" "$(get_conf "zookeeper.sasl.client.enabled" "true")"
add_javaopt "-Dzookeeper.sasl.clientconfig=" "$(get_conf "zookeeper.sasl.client.config")"
add_javaopt "-Dzookeeper.sasl.client.username=" "$(get_conf "zookeeper.sasl.client.username")"
add_javaopt "-Dzookeeper.server.realm=" "$(get_conf "zookeeper.server.realm")"
add_javaopt "-Dzookeeper.client.secure=" "$(get_conf "zookeeper.client.secure")"
add_javaopt "-Dzookeeper.ssl.keyStore.location=" "$(get_conf "zookeeper.ssl.key-store.location")"
add_javaopt "-Dzookeeper.ssl.keyStore.password=" "$(get_conf "zookeeper.ssl.key-store.password")"
add_javaopt "-Dzookeeper.ssl.trustStore.location=" "$(get_conf "zookeeper.ssl.trust-store.location")"
add_javaopt "-Dzookeeper.ssl.trustStore.password=" "$(get_conf "zookeeper.ssl.trust-store.password")"

# Infer ZooKeeper version
ZOOKEEPER_34="true"

if [ -n "$(get_conf "zookeeper.client.secure")" ]
then
  add_javaopt "-Dzookeeper.clientCnxnSocket=" "org.apache.zookeeper.ClientCnxnSocketNetty"
  ZOOKEEPER_34="false"
fi

# Classpath
CLASSPATH="$SNAP/lib/*:$SNAP/conf/:$SNAP_DATA/"

if [ "$ZOOKEEPER_34" = "true" ]
then
  CLASSPATH="$CLASSPATH:$SNAP/extra/zookeeper-3.4.11.jar"
else
  CLASSPATH="$CLASSPATH:$SNAP/extra/zookeeper-3.5.6.jar"
fi

add_javaopt "-cp " "$CLASSPATH"

#################################################
#################################################
#################################################

echo "$APPCONF" > "$SNAP_DATA/application.conf"
echo "$JAVAOPT" > "$SNAP_DATA/.javaopts"

SECRET_KEY="$(get_conf "zoonavigator.secret-key")"

if [ -n "$SECRET_KEY" ]
then
  echo "$SECRET_KEY" > "$SNAP_DATA/.secret"
fi

snapctl restart zoonavigator
