#!/usr/bin/env bash
# .SYNOPSIS
#     Installs Ookla Speedtest CLI and runs a speed test, logging results.
#
# .DESCRIPTION
#     Adds the official Ookla apt repository, installs speedtest, runs a test,
#     and logs results to /var/log/tacticalrmm/speedtest.log with a timestamp.
#     Skips install if speedtest is already present. Safe to run repeatedly.
#     Designed for Ubuntu/Debian endpoints managed via TacticalRMM (Action1).
#
# .PARAMETER LOG_DIR
#     Directory for log output. Default: /var/log/tacticalrmm
#
# .PARAMETER LOG_FILE
#     Log file name. Default: speedtest.log
#
# .OUTPUTS
#     Console output (visible in TRMM output pane).
#     Appended log entry at $LOG_FILE with timestamp, ping, download, upload.
#     Exit 0 = success, 1 = failure.
#
# .EXAMPLE
#     # Run directly
#     sudo bash nix_bash_Network_SpeedtestInstallAndRun.sh
#
#     # Override log path
#     sudo LOG_DIR=/tmp bash nix_bash_Network_SpeedtestInstallAndRun.sh
#
# .NOTES
#     Version:  1.0
#     Date:     2026-06-05
#     Author:   HuskyLogic
#
#     Ookla repo: https://packagecloud.io/ookla/speedtest-cli
#     Binary:     /usr/bin/speedtest
#     EULA:       Auto-accepted via --accept-license --accept-gdpr flags.
#     Arch:       amd64/x86_64 and arm64 supported by Ookla repo.

set -euo pipefail

# ── Config ────────────────────────────────────────────────────────────────────
LOG_DIR="${LOG_DIR:-/var/log/tacticalrmm}"
LOG_FILE="${LOG_DIR}/speedtest.log"
OOKLA_REPO_SCRIPT="https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh"
REQUIRED_PKGS=(curl apt-transport-https gnupg lsb-release)

# ── Helpers ───────────────────────────────────────────────────────────────────
log() {
    local level="$1"; shift
    echo "[$(date '+%Y-%m-%d %H:%M:%S')][$level] $*"
}

die() {
    log ERROR "$*"
    exit 1
}

require_root() {
    [[ $EUID -eq 0 ]] || die "Script must run as root (use sudo)."
}

is_debian_based() {
    command -v apt-get &>/dev/null
}

# ── Pre-flight ────────────────────────────────────────────────────────────────
require_root
is_debian_based || die "This script requires apt/Debian-based OS."

mkdir -p "$LOG_DIR"
log INFO "Log directory: $LOG_DIR"

# ── Install prerequisites ─────────────────────────────────────────────────────
log INFO "Checking prerequisites: ${REQUIRED_PKGS[*]}"
apt-get update -qq
apt-get install -y -qq "${REQUIRED_PKGS[@]}" || die "Failed to install prerequisites."

# ── Install Ookla Speedtest CLI ───────────────────────────────────────────────
if command -v speedtest &>/dev/null; then
    CURRENT_VER=$(speedtest --version 2>/dev/null | head -1 || echo "unknown")
    log INFO "speedtest already installed: $CURRENT_VER — skipping install."
else
    log INFO "Adding Ookla apt repository..."

    # Ookla's repo script doesn't recognize Linux Mint or Ubuntu 24.04 (Noble).
    # Map distros to the latest Ookla-supported Ubuntu base (jammy = 22.04).
    REPO_OS=""; REPO_DIST=""
    if [[ -f /etc/os-release ]]; then
        source /etc/os-release
        case "${ID,,}" in
            linuxmint|ubuntu)
                REPO_OS="ubuntu"
                # Noble (24.04) not yet in Ookla repo — fall back to jammy
                case "${VERSION_CODENAME,,}" in
                    noble|mantic|zena) REPO_DIST="jammy" ;;
                    *)                 REPO_DIST="${VERSION_CODENAME,,}" ;;
                esac
                ;;
            debian) REPO_OS="debian"; REPO_DIST="${VERSION_CODENAME,,}" ;;
            *)      REPO_OS=""; REPO_DIST="" ;;
        esac
    fi

    if [[ -n "$REPO_OS" && -n "$REPO_DIST" ]]; then
        log INFO "Detected: ID=${ID} — using os=$REPO_OS dist=$REPO_DIST for Ookla repo."
        curl -fsSL "$OOKLA_REPO_SCRIPT" | os="$REPO_OS" dist="$REPO_DIST" bash \
            || die "Failed to add Ookla repository."
    else
        log INFO "Unknown distro — attempting default Ookla repo script."
        curl -fsSL "$OOKLA_REPO_SCRIPT" | bash \
            || die "Failed to add Ookla repository."
    fi

    log INFO "Installing speedtest package..."
    apt-get install -y -qq speedtest \
        || die "apt-get install speedtest failed."

    INSTALLED_VER=$(speedtest --version 2>/dev/null | head -1 || echo "unknown")
    log INFO "speedtest installed: $INSTALLED_VER"
fi

# ── Run Speed Test ────────────────────────────────────────────────────────────
log INFO "Running speed test (this takes 15–30 seconds)..."

# --accept-license and --accept-gdpr suppress interactive prompts
# --format=json gives reliable parseable output
# grep extracts only the JSON line — guards against EULA text on first run
# printing to stdout before the result (Ookla behavior on fresh installs)
RAW_OUTPUT=$(speedtest --accept-license --accept-gdpr --format=json 2>&1) \
    || die "speedtest exited with error: $RAW_OUTPUT"

RAW_JSON=$(echo "$RAW_OUTPUT" | grep -m1 '^{') \
    || die "Could not find JSON in speedtest output. Raw output was: $RAW_OUTPUT"

# ── Parse Results ─────────────────────────────────────────────────────────────
# Use python3 for JSON parsing — available on all modern Ubuntu/Debian installs
parse_json() {
    python3 -c "import sys,json; d=json.load(sys.stdin); print($1)" <<< "$RAW_JSON"
}

PING_MS=$(parse_json    "'%.1f' % d['ping']['latency']")
DL_MBPS=$(parse_json    "'%.2f' % (d['download']['bandwidth'] * 8 / 1_000_000)")
UL_MBPS=$(parse_json    "'%.2f' % (d['upload']['bandwidth'] * 8 / 1_000_000)")
SERVER=$(parse_json      "'%s (%s)' % (d['server']['name'], d['server']['location'])")
ISP=$(parse_json         "d['isp']")
RESULT_URL=$(parse_json  "d.get('result', {}).get('url', 'N/A')")

# ── Display Results ───────────────────────────────────────────────────────────
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  SPEEDTEST RESULTS"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "  ISP:        $ISP"
echo "  Server:     $SERVER"
echo "  Ping:       ${PING_MS} ms"
echo "  Download:   ${DL_MBPS} Mbps"
echo "  Upload:     ${UL_MBPS} Mbps"
echo "  Result URL: $RESULT_URL"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# ── Append to Log ─────────────────────────────────────────────────────────────
HOSTNAME=$(hostname -f 2>/dev/null || hostname)
LOG_ENTRY="$(date '+%Y-%m-%d %H:%M:%S') | host=$HOSTNAME | isp=$ISP | server=$SERVER | ping=${PING_MS}ms | down=${DL_MBPS}Mbps | up=${UL_MBPS}Mbps | url=$RESULT_URL"

echo "$LOG_ENTRY" >> "$LOG_FILE"
log INFO "Results appended to $LOG_FILE"

exit 0
