#!/bin/env bash
set -euo pipefail

echo "Running cardano tracer ..."

[[ -n ${DEBUG:-} ]] && set -x

# Define a few defaults
CARDANO_CONFIG_BASE="/opt/cardano/config"

if [[ -z ${CARDANO_CONFIG:-} ]]; then
  CARDANO_CONFIG="$CARDANO_CONFIG_BASE/mainnet/tracer-config.json"
fi

# Prefer root mountpoints for consistency via symlink /opt/cardano/data -> /data
if [[ -z ${CARDANO_STATE_DIR:-} ]]; then
  CARDANO_STATE_DIR="/data/tracer"
fi

#####################################################################
#
# Print run environment
#
printRunEnv () {

  echo "CARDANO_CONFIG=$CARDANO_CONFIG"
  echo "CARDANO_STATE_DIR=$CARDANO_STATE_DIR"
  [[ -n ${CARDANO_MIN_LOG_SEVERITY:-} ]] && echo "CARDANO_MIN_LOG_SEVERITY=$CARDANO_MIN_LOG_SEVERITY"
}

#####################################################################
#
# Write root env file
#
writeRootEnv () {

cat << EOF > /usr/local/bin/env
#!/usr/bin/env bash

# Docker run ENV vars
CARDANO_CONFIG="$CARDANO_CONFIG"
CARDANO_STATE_DIR="$CARDANO_STATE_DIR"
EOF

if [[ -n ${CARDANO_MIN_LOG_SEVERITY:-} ]]; then
  echo "CARDANO_MIN_LOG_SEVERITY=\"$CARDANO_MIN_LOG_SEVERITY\"" \
    >> /usr/local/bin/env
fi
}

#####################################################################
#
# Run the tracer
#
runTracer () {

  effopts=(
    "--config" "$CARDANO_CONFIG"
    "--state-dir" "$CARDANO_STATE_DIR"
  )

  [[ -n ${CARDANO_MIN_LOG_SEVERITY:-} ]] && effopts+=("--min-log-severity" "$CARDANO_MIN_LOG_SEVERITY")

  effopts+=("${filteredOpts[@]}")

  echo "cardano-tracer ${effopts[*]}"
  exec /usr/local/bin/cardano-tracer "${effopts[@]}"
}

# Discard the leading subcommand argument (e.g. "run") passed by the entrypoint
shift

# Override default values with explicit options

options=("$@")

for i in "${!options[@]}"
do
    j=$((i + 1))
    key=${options[i]}
    val=${options[j]:-}
    found=false

    # echo "$i/$j: ${key} ${val}"

    case ${key} in
      --config) CARDANO_CONFIG=${val}; found=true;;
      --state-dir) CARDANO_STATE_DIR=${val}; found=true;;
      --min-log-severity) CARDANO_MIN_LOG_SEVERITY=${val}; found=true;;
    esac

    if [[ $found == true ]]; then
      options[i]="";
      options[j]="";
    fi
done

# Filter blank args from match removal above
filteredOpts=()
for arg in "${options[@]}"; do
  [[ -n $arg ]] && filteredOpts+=("$arg")
done

printRunEnv
writeRootEnv

# Verify required files exist before launching
[[ -f $CARDANO_CONFIG ]] || { echo "ERROR: required file not found: $CARDANO_CONFIG"; exit 1; }

runTracer
