#!/usr/bin/with-contenv bash
# shellcheck shell=bash disable=SC2016

if [[ -z "${MLAT_CONFIG}" ]] && [[ -z "$MLATHUB_NET_CONNECTOR" ]]
then
    echo "[$(date)][mlathub] No MLAT servers have been defined in MLAT_CONFIG and no external sources have been defined in MLATHUB_NET_CONNECTOR - no need to start MLATHUB"
    sleep infinity
fi

if [[ -n "${MLATHUB_DISABLED}" ]]
then
    echo "[$(date)][mlathub] MLATHUB is disabled."
    sleep infinity
fi

# Build the readsb command line based on options
MLATHUB_BIN="/usr/local/bin/readsb"

# set some basic options:
MLATHUB_CMD=("--net")
MLATHUB_CMD+=("--quiet")
MLATHUB_CMD+=("--net-only")
MLATHUB_CMD+=("--mlat")
MLATHUB_CMD+=("--forward-mlat")

# send MLAT data to the main readsb/tar1090 of this container:
# 26-mar-2023 this was removed; we'll have the main readsb connect directly to the mlat clients. This
# is to avoid a data loop in case MLATHUB_ENABLE_ADSB_INGEST is enabled
# MLATHUB_CMD+=("--net-connector=localhost,30004,beast_reduce_out")

# define some more ports:
MLATHUB_CMD+=("--net-sbs-port=${MLATHUB_SBS_OUT_PORT:-31003}")
MLATHUB_CMD+=("--net-bi-port=${MLATHUB_BEAST_IN_PORT:-31004}")
MLATHUB_CMD+=("--net-bo-port=${MLATHUB_BEAST_OUT_PORT:-31005}")
MLATHUB_CMD+=("--net-beast-reduce-out-port=${MLATHUB_BEAST_REDUCE_OUT_PORT:-31006}"))

# We need to get the mlat results ports from the parameters:
# parse MLAT_CONFIG string into mlat_configs array
readarray -td ";" mlat_configs < <(printf '%s' "${MLAT_CONFIG// /}")
# Now loop through the MLAT_CONFIG items and add a net-connector for each of them:
mlat_result_sources=0
for instance in "${mlat_configs[@]}"
do
    # shellcheck disable=SC2015
    [[ -z "${instance}" ]] && continue || true
    # put individual params into the $params array:
    readarray -td "," params < <(printf '%s' "${instance}")

    if [[ -n "${params[2]}" ]]
    then
        MLATHUB_CMD+=("--net-connector=localhost,${params[2]},beast_in")
        (( mlat_result_sources++ ))
    fi
done
if ((mlat_result_sources == 0 ))
then
    echo "[$(date)][mlathub] No MLAT servers have been defined in MLAT_CONFIG - no need to start MLATHUB"
    sleep infinity
fi

# handle MLATHUB_ENABLE_ADSB_INGEST (if set, connect to readsb as input)
if [[ -n "$MLATHUB_ENABLE_ADSB_INGEST" ]]; then
    MLATHUB_CMD+=("--net-connector=localhost,30006,beast_in")
fi

# Add any additional net_connectors:
if [[ -n "$MLATHUB_NET_CONNECTOR" ]]; then
    IFS=';' read -r -a MLATHUB_NET_CONNECTOR_ARRAY <<< "$MLATHUB_NET_CONNECTOR"
    for NET_CONNECTOR_ELEMENT in "${MLATHUB_NET_CONNECTOR_ARRAY[@]}"
    do
        MLATHUB_CMD+=("--net-connector=${NET_CONNECTOR_ELEMENT// /}")
    done
fi

if [ -n "${READSB_DEBUG}" ]; then
    MLATHUB_CMD+=("--debug=$READSB_DEBUG")
fi

if [ -n "${LAT}" ]; then
    MLATHUB_CMD+=(--lat "${LAT}")
elif [ -n "${READSB_LAT}" ]; then
    MLATHUB_CMD+=(--lat "${READSB_LAT}")
fi

if [ -n "${LONG}" ]; then
    MLATHUB_CMD+=(--lon "${LONG}")
elif [ -n "${READSB_LON}" ]; then
    MLATHUB_CMD+=(--lon "${READSB_LON}")
fi

# Handle "--max-range=<dist>"
if [[ -n "$READSB_MAX_RANGE" ]]; then
    MLATHUB_CMD+=("--max-range=$READSB_MAX_RANGE")
fi

# Handle "--net-connector-delay=<seconds>"
if [[ -n "$READSB_NET_CONNECTOR_DELAY" ]]; then
    MLATHUB_CMD+=("--net-connector-delay=$READSB_NET_CONNECTOR_DELAY")
fi

# Handle "--net-heartbeat=<rate>"
MLATHUB_CMD+=("--net-heartbeat=${READSB_NET_HEARTBEAT:-30}")

if ! pgrep readsb >/dev/null 2>&1
then
    echo "[$(date)][mlathub] Delaying MLAT hub start until container is established..."
    while ! pgrep readsb >/dev/null 2>&1
    do
        sleep 2
    done
fi
sleep 5     # sleep a bit so readsb is well established

echo "[$(date)][mlathub] Starting MLATHUB..."

# shellcheck disable=SC2086
if [[ -z "${LOGLEVEL}" ]] || [[ "${LOGLEVEL,,}" == "verbose" ]]; then
    "${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS 2>&1 | \
	mawk -W Interactive '{print "[" strftime("%Y/%m/%d %H:%M:%S", systime()) "][mlathub] " $0}'
elif [[ "${LOGLEVEL,,}" == "error" ]]; then
    "${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS 2>&1 >/dev/null | \
	mawk -W Interactive '{print "[" strftime("%Y/%m/%d %H:%M:%S", systime()) "][mlathub] " $0}'
elif [[ "${LOGLEVEL,,}" == "none" ]]; then
    "${MLATHUB_BIN}" "${MLATHUB_CMD[@]}" $MLATHUB_EXTRA_ARGS >/dev/null 2>/dev/null 
fi