#!/usr/bin/env bash
# SNMP smoke test using the Ubuntu `snmp` package (snmpget/snmpwalk/snmpset).
# No PHPUnit/Composer (§43).
#
# Usage: tests/test-snmp.sh [HOST] [PORT] [RO_COMMUNITY] [RW_COMMUNITY] [PORT_NUMBER]
#   Defaults match the seeded demo switch: 127.0.0.1 1161 public private 1
set -euo pipefail

HOST="${1:-127.0.0.1}"
PORT="${2:-1161}"
RO="${3:-public}"
RW="${4:-private}"
PORT_NUMBER="${5:-1}"

if ! command -v snmpget >/dev/null; then
    echo "snmpget not found — install with: sudo apt-get install snmp" >&2
    exit 1
fi

FAILURES=0
check() {
    local label="$1"; shift
    if "$@" >/tmp/barox_snmp_test_out 2>&1; then
        echo "  [OK]   $label"
    else
        echo "  [FAIL] $label"
        cat /tmp/barox_snmp_test_out
        FAILURES=$((FAILURES + 1))
    fi
}

echo "barox Virtual Switch Simulator — SNMP smoke test ($HOST:$PORT)"
echo "============================================================"

check "GET sysDescr.0" \
    snmpget -v2c -c "$RO" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.1.1.0

check "GET sysUpTime.0" \
    snmpget -v2c -c "$RO" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.1.3.0

check "GETNEXT walk of sysName..sysLocation" \
    snmpwalk -v2c -c "$RO" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.1

check "GETBULK walk of ifTable (ifDescr column)" \
    snmpbulkwalk -v2c -c "$RO" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.2.2.1.2

check "GET ifAdminStatus for port ${PORT_NUMBER}" \
    snmpget -v2c -c "$RO" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.2.2.1.7.${PORT_NUMBER}

echo "  -- SNMP SET: disabling port ${PORT_NUMBER} via ifAdminStatus --"
check "SET ifAdminStatus.${PORT_NUMBER} = down(2) [RW community]" \
    snmpset -v2c -c "$RW" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.2.2.1.7.${PORT_NUMBER} i 2

check "GET ifAdminStatus.${PORT_NUMBER} reflects down(2)" \
    bash -c "snmpget -v2c -c '$RO' -t 3 -r 1 '${HOST}:${PORT}' 1.3.6.1.2.1.2.2.1.7.${PORT_NUMBER} | grep -q 'INTEGER: 2'"

check "SET ifAdminStatus.${PORT_NUMBER} = up(1) to restore state [RW community]" \
    snmpset -v2c -c "$RW" -t 3 -r 1 "${HOST}:${PORT}" 1.3.6.1.2.1.2.2.1.7.${PORT_NUMBER} i 1

check "SET rejected with RO community (should fail/timeout)" \
    bash -c "! snmpset -v2c -c '$RO' -t 2 -r 0 '${HOST}:${PORT}' 1.3.6.1.2.1.2.2.1.7.${PORT_NUMBER} i 1 >/tmp/barox_snmp_test_out 2>&1"

echo "============================================================"
if [ "$FAILURES" -gt 0 ]; then
    echo "$FAILURES check(s) FAILED."
    exit 1
fi
echo "All checks passed. Cross-check the changed state in the Web UI to"
echo "confirm SNMP writes and the UI share the same underlying state (§59)."
