#!/bin/bash

# kcptun-rust 测试脚本
# 用于测试客户端和服务端的连接

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 配置
SERVER_LISTEN="127.0.0.1:29900"
SERVER_TARGET="127.0.0.1:8080"
CLIENT_LOCAL="127.0.0.1:12948"
CLIENT_REMOTE="127.0.0.1:29900"
KEY="test-key-12345678"
CRYPT="aes"

# 二进制路径
CLIENT_BIN="./target/release/kcptun-client"
SERVER_BIN="./target/release/kcptun-server"

# 检查二进制文件是否存在
if [ ! -f "$CLIENT_BIN" ]; then
    echo -e "${RED}错误: 找不到客户端程序 $CLIENT_BIN${NC}"
    echo "请先运行: cargo build --release"
    exit 1
fi

if [ ! -f "$SERVER_BIN" ]; then
    echo -e "${RED}错误: 找不到服务端程序 $SERVER_BIN${NC}"
    echo "请先运行: cargo build --release"
    exit 1
fi

echo -e "${GREEN}=== kcptun-rust 连接测试 ===${NC}"
echo ""

# 清理函数
cleanup() {
    echo ""
    echo -e "${YELLOW}正在清理进程...${NC}"
    kill $SERVER_PID $CLIENT_PID $TARGET_PID 2>/dev/null || true
    wait $SERVER_PID $CLIENT_PID $TARGET_PID 2>/dev/null || true
    echo -e "${GREEN}清理完成${NC}"
}

trap cleanup EXIT INT TERM

# 启动一个简单的 HTTP 服务器作为目标
echo -e "${YELLOW}[1/4] 启动目标 HTTP 服务器 (端口 8080)...${NC}"
python3 -m http.server 8080 > /dev/null 2>&1 &
TARGET_PID=$!
sleep 1

if ! kill -0 $TARGET_PID 2>/dev/null; then
    echo -e "${RED}错误: 无法启动 HTTP 服务器${NC}"
    exit 1
fi
echo -e "${GREEN}✓ 目标服务器已启动 (PID: $TARGET_PID)${NC}"
echo ""

# 启动 kcptun 服务端
echo -e "${YELLOW}[2/4] 启动 kcptun 服务端...${NC}"
echo "  监听地址: $SERVER_LISTEN"
echo "  目标地址: $SERVER_TARGET"
echo "  加密算法: $CRYPT"
$SERVER_BIN \
    --listen "$SERVER_LISTEN" \
    --target "$SERVER_TARGET" \
    --key "$KEY" \
    --crypt "$CRYPT" \
    --quiet \
    > /tmp/kcptun-server.log 2>&1 &
SERVER_PID=$!
sleep 2

if ! kill -0 $SERVER_PID 2>/dev/null; then
    echo -e "${RED}错误: 服务端启动失败${NC}"
    echo "日志:"
    cat /tmp/kcptun-server.log
    exit 1
fi
echo -e "${GREEN}✓ 服务端已启动 (PID: $SERVER_PID)${NC}"
echo ""

# 启动 kcptun 客户端
echo -e "${YELLOW}[3/4] 启动 kcptun 客户端...${NC}"
echo "  本地地址: $CLIENT_LOCAL"
echo "  远程地址: $CLIENT_REMOTE"
echo "  加密算法: $CRYPT"
$CLIENT_BIN \
    --localaddr "$CLIENT_LOCAL" \
    --remoteaddr "$CLIENT_REMOTE" \
    --key "$KEY" \
    --crypt "$CRYPT" \
    --quiet \
    > /tmp/kcptun-client.log 2>&1 &
CLIENT_PID=$!
sleep 2

if ! kill -0 $CLIENT_PID 2>/dev/null; then
    echo -e "${RED}错误: 客户端启动失败${NC}"
    echo "日志:"
    cat /tmp/kcptun-client.log
    exit 1
fi
echo -e "${GREEN}✓ 客户端已启动 (PID: $CLIENT_PID)${NC}"
echo ""

# 等待连接建立
echo -e "${YELLOW}[4/4] 等待连接建立...${NC}"
echo "  等待 5 秒让 KCP 连接建立..."
sleep 5
echo ""

# 测试连接
echo -e "${YELLOW}测试连接...${NC}"
echo ""

# 测试 1: 检查端口是否在监听
echo -e "${YELLOW}测试 1: 端口监听检查${NC}"
if lsof -i :8080 > /dev/null 2>&1; then
    echo -e "${GREEN}✓ 目标服务器端口 8080 正在监听${NC}"
else
    echo -e "${RED}✗ 目标服务器端口 8080 未监听${NC}"
fi

if lsof -i :29900 > /dev/null 2>&1; then
    echo -e "${GREEN}✓ 服务端端口 29900 正在监听${NC}"
else
    echo -e "${YELLOW}⚠ 服务端端口 29900 未监听（UDP 可能不显示）${NC}"
fi

if lsof -i :12948 > /dev/null 2>&1; then
    echo -e "${GREEN}✓ 客户端端口 12948 正在监听${NC}"
else
    echo -e "${RED}✗ 客户端端口 12948 未监听${NC}"
fi
echo ""

# 测试 2: 直接测试目标服务器（不通过隧道）
echo -e "${YELLOW}测试 2: 直接访问目标服务器${NC}"
DIRECT_RESPONSE=$(curl -s --noproxy "*" -w "\n%{http_code}" --max-time 3 "http://127.0.0.1:8080/" 2>&1 || echo "FAILED")
DIRECT_CODE=$(echo "$DIRECT_RESPONSE" | tail -n 1)

if [ "$DIRECT_CODE" = "200" ]; then
    echo -e "${GREEN}✓ 目标服务器响应正常 (状态码: $DIRECT_CODE)${NC}"
    TARGET_OK=true
else
    echo -e "${YELLOW}⚠ 目标服务器响应异常 (状态码: $DIRECT_CODE)${NC}"
    TARGET_OK=false
fi
echo ""

# 测试 3: 通过隧道访问 HTTP 服务器
echo -e "${YELLOW}测试 3: 通过 kcptun 隧道访问${NC}"
if [ "$TARGET_OK" = true ]; then
    # 禁用所有代理，直接连接，使用 curl 的 --max-time 而不是 -m（macOS 兼容）
    HTTP_RESPONSE=$(curl -s --noproxy "*" -w "\n%{http_code}" --max-time 10 "http://$CLIENT_LOCAL/" 2>&1 || echo "FAILED")
    HTTP_CODE=$(echo "$HTTP_RESPONSE" | tail -n 1)
    
    if [ "$HTTP_CODE" = "200" ]; then
        echo -e "${GREEN}✓ 通过隧道访问成功 (状态码: $HTTP_CODE)${NC}"
        echo -e "${GREEN}✓ kcptun 连接正常工作！${NC}"
    elif [ "$HTTP_CODE" = "000" ] || [ "$HTTP_CODE" = "FAILED" ]; then
        echo -e "${YELLOW}⚠ 连接超时或失败 (可能连接尚未建立)${NC}"
        echo -e "${YELLOW}   这可能是正常的，因为 KCP 连接需要一些时间建立${NC}"
        echo -e "${YELLOW}   请检查日志文件查看详细信息${NC}"
    else
        echo -e "${YELLOW}⚠ HTTP 请求返回状态码: $HTTP_CODE${NC}"
        echo "响应前 5 行:"
        echo "$HTTP_RESPONSE" | head -n 5
    fi
else
    echo -e "${YELLOW}⚠ 跳过隧道测试（目标服务器不可用）${NC}"
fi
echo ""

# 测试 4: 使用 netcat 测试 TCP 连接
echo -e "${YELLOW}测试 4: TCP 连接测试${NC}"
if command -v nc > /dev/null 2>&1; then
    if echo "GET / HTTP/1.0\r\n\r\n" | nc -w 2 127.0.0.1 12948 > /tmp/nc_test.txt 2>&1; then
        if grep -q "HTTP" /tmp/nc_test.txt 2>/dev/null; then
            echo -e "${GREEN}✓ TCP 连接成功，收到 HTTP 响应${NC}"
        else
            echo -e "${YELLOW}⚠ TCP 连接成功，但未收到 HTTP 响应${NC}"
        fi
    else
        echo -e "${YELLOW}⚠ TCP 连接测试超时或失败${NC}"
    fi
else
    echo -e "${YELLOW}⚠ netcat 未安装，跳过 TCP 连接测试${NC}"
fi
echo ""

# 测试 5: 检查进程状态
echo -e "${YELLOW}测试 5: 进程状态检查${NC}"
if kill -0 $SERVER_PID 2>/dev/null; then
    echo -e "${GREEN}✓ 服务端进程运行正常 (PID: $SERVER_PID)${NC}"
else
    echo -e "${RED}✗ 服务端进程已停止${NC}"
fi

if kill -0 $CLIENT_PID 2>/dev/null; then
    echo -e "${GREEN}✓ 客户端进程运行正常 (PID: $CLIENT_PID)${NC}"
else
    echo -e "${RED}✗ 客户端进程已停止${NC}"
fi

if kill -0 $TARGET_PID 2>/dev/null; then
    echo -e "${GREEN}✓ 目标服务器进程运行正常 (PID: $TARGET_PID)${NC}"
else
    echo -e "${RED}✗ 目标服务器进程已停止${NC}"
fi
echo ""

# 测试 6: 查看详细日志
echo -e "${YELLOW}测试 6: 查看服务端日志 (最后 15 行)${NC}"
if [ -f /tmp/kcptun-server.log ]; then
    tail -n 15 /tmp/kcptun-server.log
    # 检查是否有连接相关的日志
    if grep -q "Accepted connection\|remote address" /tmp/kcptun-server.log 2>/dev/null; then
        echo -e "${GREEN}✓ 服务端日志显示有连接建立${NC}"
    else
        echo -e "${YELLOW}⚠ 服务端日志未显示连接建立（可能连接尚未建立）${NC}"
    fi
else
    echo "无日志文件"
fi
echo ""

echo -e "${YELLOW}测试 6: 查看客户端日志 (最后 15 行)${NC}"
if [ -f /tmp/kcptun-client.log ]; then
    tail -n 15 /tmp/kcptun-client.log
    # 检查是否有连接相关的日志
    if grep -q "Stream opened\|Created new KCP connection" /tmp/kcptun-client.log 2>/dev/null; then
        echo -e "${GREEN}✓ 客户端日志显示有连接建立${NC}"
    else
        echo -e "${YELLOW}⚠ 客户端日志未显示连接建立（可能连接尚未建立）${NC}"
    fi
else
    echo "无日志文件"
fi
echo ""

# 总结
echo -e "${GREEN}=== 测试完成 ===${NC}"
echo ""
echo "进程信息:"
echo "  目标服务器 PID: $TARGET_PID"
echo "  服务端 PID: $SERVER_PID"
echo "  客户端 PID: $CLIENT_PID"
echo ""
echo "日志文件:"
echo "  服务端: /tmp/kcptun-server.log"
echo "  客户端: /tmp/kcptun-client.log"
echo ""
echo -e "${YELLOW}按 Ctrl+C 停止所有进程${NC}"

# 保持运行
wait
