#!/usr/bin/env bash
set -u

BASE_URL="${BASE_URL:-http://172.26.154.109}"
MQTT_HOST="${MQTT_HOST:-172.26.154.109}"
MQTT_PORT="${MQTT_PORT:-1883}"
HTTP_TIMEOUT="${HTTP_TIMEOUT:-10}"

PASS_COUNT=0
FAIL_COUNT=0
WARN_COUNT=0

pass() {
  PASS_COUNT=$((PASS_COUNT + 1))
  printf 'PASS  %s\n' "$1"
}

fail() {
  FAIL_COUNT=$((FAIL_COUNT + 1))
  printf 'FAIL  %s\n' "$1"
}

warn() {
  WARN_COUNT=$((WARN_COUNT + 1))
  printf 'WARN  %s\n' "$1"
}

for command_name in bash curl python3; do
  if command -v "$command_name" >/dev/null 2>&1; then
    pass "command=$command_name path=$(command -v "$command_name")"
  else
    fail "missing command=$command_name"
  fi
done

if command -v python3 >/dev/null 2>&1; then
  if python3 - <<'PY'
import sys
raise SystemExit(0 if sys.version_info >= (3, 9) else 1)
PY
  then
    pass "python_version=$(python3 --version 2>&1)"
  else
    fail "Python 3.9 or newer is required; current=$(python3 --version 2>&1)"
  fi
fi

PROXY_NAMES=(http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY all_proxy)
ACTIVE_PROXIES=()
for proxy_name in "${PROXY_NAMES[@]}"; do
  if [[ -n "${!proxy_name:-}" ]]; then
    ACTIVE_PROXIES+=("$proxy_name")
  fi
done
if (( ${#ACTIVE_PROXIES[@]} == 0 )); then
  pass "proxy environment is clear"
else
  warn "proxy variables detected: ${ACTIVE_PROXIES[*]}; script requests use --noproxy '*'"
fi

if command -v curl >/dev/null 2>&1; then
  HTTP_CODE="$(
    curl --noproxy '*' -sS -o /dev/null \
      --connect-timeout 5 --max-time "$HTTP_TIMEOUT" \
      -w '%{http_code}' "${BASE_URL%/}/" 2>/dev/null
  )"
  CURL_RC=$?
  if [[ "$CURL_RC" -eq 0 && "$HTTP_CODE" =~ ^(2|3|4)[0-9][0-9]$ ]]; then
    pass "HTTP entry reachable: ${BASE_URL%/}/ HTTP=$HTTP_CODE"
  else
    fail "HTTP entry unreachable: ${BASE_URL%/}/ curl_rc=$CURL_RC HTTP=${HTTP_CODE:-000}"
  fi
fi

if command -v python3 >/dev/null 2>&1; then
  if MQTT_HOST="$MQTT_HOST" MQTT_PORT="$MQTT_PORT" TIMEOUT="$HTTP_TIMEOUT" python3 - <<'PY'
import os
import socket

with socket.create_connection(
    (os.environ["MQTT_HOST"], int(os.environ["MQTT_PORT"])),
    timeout=float(os.environ["TIMEOUT"]),
):
    pass
PY
  then
    pass "MQTT TCP reachable: $MQTT_HOST:$MQTT_PORT"
  else
    fail "MQTT TCP unreachable: $MQTT_HOST:$MQTT_PORT"
  fi
fi

printf '\nPASS_COUNT=%d\nWARN_COUNT=%d\nFAIL_COUNT=%d\n' \
  "$PASS_COUNT" "$WARN_COUNT" "$FAIL_COUNT"

if (( FAIL_COUNT == 0 )); then
  echo "RESULT=PASS"
  exit 0
fi

echo "RESULT=FAIL"
exit 1
