#!/bin/bash

# Some of the contents of this file came from here - https://github.com/kubernetes/heapster/blob/ed5baadf04ea9f8e48fc7d44dad63a63af34ff9b/grafana/run.sh
HEADER_CONTENT_TYPE="Content-Type: application/json"
HEADER_ACCEPT="Accept: application/json"

NAMESPACE=${NAMESPACE:-drycc}
GRAFANA_USER=${DEFAULT_USER:-admin}
GRAFANA_PASSWD=${DEFAULT_USER_PASSWORD:-admin}
GRAFANA_PORT=${BIND_PORT:-3000}

DASHBOARD_LOCATION=${DASHBOARD_JSON_PATH:-"/usr/share/grafana/api/dashboards"}
# Create the dashboards directory
mkdir /usr/share/grafana/dashboards

echo "Building grafana.ini!"
envtpl > grafana.ini < grafana.ini.tpl
echo "Finished building grafana config..."
echo "###########################################"
echo "###########################################"
cat /usr/share/grafana/grafana.ini
echo "###########################################"
echo "###########################################"

if [ -n "${LDAP_ENDPOINT}" ]; then
  echo "Building ldap.toml!"
  OLD_IFS="$IFS"
  IFS=':/' read -ra ldap_url_array <<< "$LDAP_ENDPOINT"
  IFS="$OLD_IFS"
  ldap_schema=${ldap_url_array[0]}
  if [ "${ldap_schema}" == "ldaps" ]; then
    export LDAP_USE_SSL=true
  else
    export LDAP_USE_SSL=false
  fi
  export LDAP_HOST=${ldap_url_array[3]//\/\//}
  export LDAP_PORT=${ldap_url_array[4]}
  envtpl > ldap.toml < ldap.toml.tpl
  echo "Finished building ldap config..."
  echo "###########################################"
  echo "###########################################"
  cat /usr/share/grafana/ldap.toml
  echo "###########################################"
  echo "###########################################"
fi

GF_PATHS_PLUGINS=${PLUGINS_PATH:-"/var/lib/grafana/plugins"}
if [ -n "${GF_INSTALL_PLUGINS}" ]; then
  echo "Installing Grafana plugins..."
  OLDIFS=$IFS
  IFS=','
  for plugin in ${GF_INSTALL_PLUGINS}; do
    echo "Installing ${plugin} ..."
    grafana-cli  --pluginsDir "${GF_PATHS_PLUGINS}" plugins install "${plugin}"
    echo ""
    echo "Done installing ${plugin}"
  done
  IFS=$OLDIFS
fi

set -m
echo "Starting Grafana in the background"
exec grafana-server -config /usr/share/grafana/grafana.ini -homepath /opt/drycc/grafana &
echo "Waiting for Grafana to come up..."
until curl -q --fail --output /dev/null --silent "http://${GRAFANA_USER}:${GRAFANA_PASSWD}@localhost:${GRAFANA_PORT}/api/org"; do
  printf "."
  sleep 2
done
echo "Grafana is up and running."

# Allow access to dashboards without having to log in
export GF_AUTH_ANONYMOUS_ENABLED=true
export GF_SERVER_HTTP_PORT=${GRAFANA_PORT}

BACKEND_ACCESS_MODE=${BACKEND_ACCESS_MODE:-proxy}
PROMETHEUS_URL=${PROMETHEUS_URL:-"http://${DRYCC_PROMETHEUS_SERVICE_HOST}:${DRYCC_PROMETHEUS_SERVICE_PORT}"}

echo "Using the following URL for prometheus: ${PROMETHEUS_URL}"
echo "Using the following backend access mode for prometheus: ${BACKEND_ACCESS_MODE}"

echo "Creating default prometheus datasource..."
curl -i -XPOST -H "${HEADER_ACCEPT}" -H "${HEADER_CONTENT_TYPE}" "http://${GRAFANA_USER}:${GRAFANA_PASSWD}@localhost:${GRAFANA_PORT}/api/datasources" -d '
{
  "name": "prometheus-datasource",
  "type": "prometheus",
  "access": "'"${BACKEND_ACCESS_MODE}"'",
  "isDefault": true,
  "url": "'"${PROMETHEUS_URL}"'"
}'

echo ""
echo "Importing default dashboards..."
# replace namespace
# shellcheck disable=SC1003
# shellcheck disable=SC2046
sed -i 's@r\[\\"namespace\\\"\] == \\"drycc\\"@r\[\\"namespace\\"\] == \\"\'"${NAMESPACE}"'\\"@g' $(grep -F 'r[\"namespace\"] == \"drycc\"' -rl --include="*.json" "${DASHBOARD_LOCATION}")
# drycc component dashboard
DCD="${DASHBOARD_LOCATION}"/drycc_component_health.json

# remove off-cluster component panel
if [ "on-cluster" != "${VALKEY_LOCATION}" ]; then
  rm -rf "${DASHBOARD_LOCATION}"/valkey.json
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "VALKEY"))')" > "${DCD}"
fi
if [ "on-cluster" != "${DATABASE_LOCATION}" ]; then
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "DATABASE"))')" > "${DCD}"
fi
if [ "on-cluster" != "${PASSPORT_LOCATION}" ]; then
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "PASSPORT"))')" > "${DCD}"
fi
if [ "on-cluster" != "${REGISTRY_LOCATION}" ]; then
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "REGISTRY"))')" > "${DCD}"
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "REGISTRY-PROXY"))')" > "${DCD}"
fi
if [ "on-cluster" != "${STORAGE_LOCATION}" ]; then
  rm -rf "${DASHBOARD_LOCATION}"/pd.json "${DASHBOARD_LOCATION}"/tikv.json
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "STORAGE-MINIO"))')" > "${DCD}"
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "STORAGE-META-PD"))')" > "${DCD}"
  # shellcheck disable=SC2005
  echo "$(<"${DCD}" jq 'del(.dashboard.panels[] | select(.title == "STORAGE-META-TIKV"))')" > "${DCD}"
fi

for filename in "${DASHBOARD_LOCATION}"/*.json; do
  echo "Importing ${filename} ..."
  curl -i -XPOST --data "@${filename}" -H "${HEADER_ACCEPT}" -H "${HEADER_CONTENT_TYPE}" "http://${GRAFANA_USER}:${GRAFANA_PASSWD}@localhost:${GRAFANA_PORT}/api/dashboards/db"
  echo ""
  echo "Done importing ${filename}"
done

echo "Bringing Grafana back to the foreground"
fg
