#!/usr/bin/env bash
# Exercises the REST API v1 with curl (§43). No PHPUnit/Composer.
#
# Usage: tests/test-api.sh <API_KEY> [BASE_URL] [SWITCH_ID] [PORT_NUMBER]
#   BASE_URL defaults to http://localhost, SWITCH_ID/PORT_NUMBER default to 1/1.
#
# Create an API key first: log into the Web UI as administrator -> API Keys.
set -euo pipefail

API_KEY="${1:?Usage: tests/test-api.sh <API_KEY> [BASE_URL] [SWITCH_ID] [PORT_NUMBER]}"
BASE_URL="${2:-http://localhost}"
SWITCH_ID="${3:-1}"
PORT_NUMBER="${4:-1}"

AUTH_HEADER="Authorization: Bearer ${API_KEY}"
FAILURES=0

req() {
    local method="$1" path="$2" data="${3:-}"
    if [ -n "$data" ]; then
        curl -sS -o /tmp/barox_api_test_body -w '%{http_code}' -X "$method" \
            -H "$AUTH_HEADER" -H 'Content-Type: application/json' \
            -d "$data" "${BASE_URL}${path}"
    else
        curl -sS -o /tmp/barox_api_test_body -w '%{http_code}' -X "$method" \
            -H "$AUTH_HEADER" "${BASE_URL}${path}"
    fi
}

check() {
    local label="$1" expected="$2" actual="$3"
    if [ "$actual" = "$expected" ]; then
        echo "  [OK]   $label (HTTP $actual)"
    else
        echo "  [FAIL] $label (expected HTTP $expected, got $actual)"
        cat /tmp/barox_api_test_body
        echo
        FAILURES=$((FAILURES + 1))
    fi
}

echo "barox Virtual Switch Simulator — REST API smoke test"
echo "Base URL: $BASE_URL"
echo "============================================================"

code=$(req GET "/api/v1/switches"); check "GET /api/v1/switches" 200 "$code"
code=$(req GET "/api/v1/switches/${SWITCH_ID}"); check "GET /api/v1/switches/${SWITCH_ID}" 200 "$code"
code=$(req GET "/api/v1/switches/${SWITCH_ID}/ports"); check "GET /api/v1/switches/${SWITCH_ID}/ports" 200 "$code"
code=$(req GET "/api/v1/switches/${SWITCH_ID}/ports/${PORT_NUMBER}"); check "GET .../ports/${PORT_NUMBER}" 200 "$code"

code=$(req PUT "/api/v1/switches/${SWITCH_ID}/ports/${PORT_NUMBER}" '{"link_state":"up","speed":1000,"duplex":"full"}')
check "PUT .../ports/${PORT_NUMBER} (link up)" 200 "$code"

code=$(req PUT "/api/v1/switches/${SWITCH_ID}/ports/${PORT_NUMBER}/poe" '{"enabled":true}')
check "PUT .../ports/${PORT_NUMBER}/poe (enable)" 200 "$code"

code=$(req POST "/api/v1/switches/${SWITCH_ID}/ports/${PORT_NUMBER}/clear-counters")
check "POST .../ports/${PORT_NUMBER}/clear-counters" 200 "$code"

code=$(req GET "/api/v1/switches/${SWITCH_ID}/mac"); check "GET .../mac" 200 "$code"
code=$(req GET "/api/v1/switches/${SWITCH_ID}/lldp"); check "GET .../lldp" 200 "$code"
code=$(req GET "/api/v1/switches/${SWITCH_ID}/events"); check "GET .../events" 200 "$code"
code=$(req GET "/api/v1/scenarios"); check "GET /api/v1/scenarios" 200 "$code"

code=$(curl -sS -o /tmp/barox_api_test_body -w '%{http_code}' "${BASE_URL}/api/v1/switches")
check "GET /api/v1/switches without Authorization header is rejected" 401 "$code"

echo "============================================================"
if [ "$FAILURES" -gt 0 ]; then
    echo "$FAILURES check(s) FAILED."
    exit 1
fi
echo "All checks passed."
