#!/bin/bash
# Dream Server Integration Test Suite
# Validates all services are working end-to-end
#
# Usage: ./tests/test-integration.sh [--verbose] [--quick]

# Note: Intentionally NOT using set -e here — test functions return 1 on failure
# and we want to continue running all tests, tracking results via PASSED/FAILED counters
set -uo pipefail

# Check for required dependencies
command -v jq >/dev/null 2>&1 || { echo -e "${RED}✗${NC} jq is required but not installed. Install with: apt-get install jq (Debian/Ubuntu) or brew install jq (macOS)"; exit 1; }

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Config
VERBOSE=${VERBOSE:-false}
QUICK=${QUICK:-false}
TIMEOUT=10
PASSED=0
FAILED=0
SKIPPED=0

# Parse args
for arg in "$@"; do
    case $arg in
        --verbose|-v) VERBOSE=true ;;
        --quick|-q) QUICK=true ;;
        --help|-h)
            echo "Usage: $0 [--verbose] [--quick]"
            echo "  --verbose  Show detailed output"
            echo "  --quick    Skip slow tests"
            exit 0
            ;;
    esac
done

# Logging
log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
log_pass() { echo -e "${GREEN}✓${NC} $1"; ((PASSED++)); }
log_fail() { echo -e "${RED}✗${NC} $1"; ((FAILED++)); }
log_skip() { echo -e "${YELLOW}○${NC} $1 (skipped)"; ((SKIPPED++)); }
log_verbose() { $VERBOSE && echo -e "  ${NC}$1" || true; }

# Test helpers
test_http() {
    local name="$1"
    local url="$2"
    local expected="${3:-200}"
    local method="${4:-GET}"
    local data="${5:-}"
    
    local args=(-s -o /dev/null -w "%{http_code}" --max-time "$TIMEOUT")
    [[ -n "$data" ]] && args+=(-X "$method" -H "Content-Type: application/json" -d "$data")
    
    local code
    code=$(curl "${args[@]}" "$url" 2>/dev/null) || code="000"
    
    if [[ "$code" == "$expected" ]]; then
        log_pass "$name"
        return 0
    else
        log_fail "$name (expected $expected, got $code)"
        return 1
    fi
}

test_json() {
    local name="$1"
    local url="$2"
    local jq_filter="$3"
    
    local response
    response=$(curl -s --max-time $TIMEOUT "$url" 2>/dev/null) || response=""
    
    if echo "$response" | jq -e "$jq_filter" >/dev/null 2>&1; then
        log_pass "$name"
        local summary
        summary=$(echo "$response" | jq -c '.' 2>/dev/null || echo "$response")
        log_verbose "Response: ${summary:0:100}"
        return 0
    else
        log_fail "$name (jq filter failed: $jq_filter)"
        log_verbose "Response: ${response:0:100}"
        return 1
    fi
}

test_llm() {
    local name="$1"
    local url="$2"
    local prompt="$3"
    
    local data
    data=$(jq -n --arg prompt "$prompt" '{
        model: "qwen2.5-32b-instruct",
        messages: [{role: "user", content: $prompt}],
        max_tokens: 50,
        stream: false
    }')
    
    local response
    response=$(curl -s --max-time 30 -X POST \
        -H "Content-Type: application/json" \
        -d "$data" \
        "$url/v1/chat/completions" 2>/dev/null) || response=""
    
    if echo "$response" | jq -e '.choices[0].message.content' >/dev/null 2>&1; then
        local content
        content=$(echo "$response" | jq -r '.choices[0].message.content' | head -c 100)
        log_pass "$name"
        log_verbose "Response: $content"
        return 0
    else
        log_fail "$name (no valid response)"
        log_verbose "Response: $response"
        return 1
    fi
}

# Header
echo ""
echo -e "${BLUE}╔══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║${NC}  Dream Server Integration Tests                              ${BLUE}║${NC}"
echo -e "${BLUE}╚══════════════════════════════════════════════════════════════╝${NC}"
echo ""

# ========================================
# Dashboard API Tests
# ========================================
echo -e "${BLUE}▸ Dashboard API${NC}"

test_http "API health check" "http://localhost:3002/health"
test_json "API status endpoint" "http://localhost:3002/api/status" '.gpu or .services'
test_json "GPU metrics" "http://localhost:3002/gpu" '.name and .memory_used_mb'
test_json "Service list" "http://localhost:3002/services" '. | length > 0'

# ========================================
# Model API Tests
# ========================================
echo ""
echo -e "${BLUE}▸ Model Manager API${NC}"

test_json "Model catalog" "http://localhost:3002/api/models" '.models | length > 0'
test_json "VRAM info in catalog" "http://localhost:3002/api/models" '.gpu.vramTotal > 0'

# ========================================
# Workflow API Tests
# ========================================
echo ""
echo -e "${BLUE}▸ Workflow API${NC}"

test_json "Workflow catalog" "http://localhost:3002/api/workflows" '.workflows | length > 0'
test_json "Workflow categories" "http://localhost:3002/api/workflows" '.categories | keys | length > 0'

# ========================================
# Voice API Tests
# ========================================
echo ""
echo -e "${BLUE}▸ Voice API${NC}"

test_json "Voice status" "http://localhost:3002/api/voice/status" '.services'

# ========================================
# Core Service Tests
# ========================================
echo ""
echo -e "${BLUE}▸ Core Services${NC}"

# llama-server
if ! $QUICK; then
    test_http "llama-server health" "http://localhost:8080/health"
    test_llm "llama-server inference" "http://localhost:8080" "Say hello in exactly 3 words."
else
    log_skip "llama-server inference test"
fi

# n8n
test_http "n8n health" "http://localhost:5678/healthz" || log_skip "n8n not running"

# Qdrant
test_http "Qdrant health" "http://localhost:6333/" || log_skip "Qdrant not running"

# ========================================
# Voice Services Tests
# ========================================
echo ""
echo -e "${BLUE}▸ Voice Services${NC}"

test_http "Whisper STT" "http://localhost:9001/" || log_skip "Whisper not running"
test_http "Kokoro TTS" "http://localhost:8880/" || log_skip "Kokoro not running"
test_http "LiveKit" "http://localhost:7880/" || log_skip "LiveKit not running"

# ========================================
# Dashboard UI Tests
# ========================================
echo ""
echo -e "${BLUE}▸ Dashboard UI${NC}"

test_http "Dashboard serves" "http://localhost:3001/"

# ========================================
# Summary
# ========================================
echo ""
echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"
TOTAL=$((PASSED + FAILED + SKIPPED))
echo -e "Results: ${GREEN}$PASSED passed${NC} / ${RED}$FAILED failed${NC} / ${YELLOW}$SKIPPED skipped${NC} ($TOTAL total)"

if [[ $FAILED -gt 0 ]]; then
    echo -e "${RED}Some tests failed. Check the output above.${NC}"
    exit 1
else
    echo -e "${GREEN}All active tests passed!${NC}"
    exit 0
fi
