#!/bin/bash

# 压缩功能测试 - Rust <-> Rust

set -e

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

echo -e "${BLUE}=== 压缩功能测试 (Rust 客户端 <-> Rust 服务端) ===${NC}"
echo ""

# 配置
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-128"

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

# 清理函数
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

# 启动目标服务器
echo -e "${YELLOW}[1/4] 启动目标 HTTP 服务器...${NC}"
python3 -m http.server 8080 > /tmp/target-server.log 2>&1 &
TARGET_PID=$!
sleep 1
echo -e "${GREEN}✓ 目标服务器已启动 (PID: $TARGET_PID)${NC}"
echo ""

# 启动 Rust kcptun 服务端（启用压缩）
echo -e "${YELLOW}[2/4] 启动 Rust kcptun 服务端（启用压缩）...${NC}"
$RUST_SERVER \
    --listen "$SERVER_LISTEN" \
    --target "$SERVER_TARGET" \
    --key "$KEY" \
    --crypt "$CRYPT" \
    --datashard 10 \
    --parityshard 3 \
    > /tmp/rust-server-comp.log 2>&1 &
SERVER_PID=$!
sleep 2

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

# 启动 Rust 客户端（启用压缩）
echo -e "${YELLOW}[3/4] 启动 Rust kcptun 客户端（启用压缩）...${NC}"
$RUST_CLIENT \
    --localaddr "$CLIENT_LOCAL" \
    --remoteaddr "$CLIENT_REMOTE" \
    --key "$KEY" \
    --crypt "$CRYPT" \
    --datashard 10 \
    --parityshard 3 \
    > /tmp/rust-client-comp.log 2>&1 &
CLIENT_PID=$!
sleep 2

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

# 等待并测试
echo -e "${YELLOW}[4/4] 测试连接...${NC}"
echo "  等待 3 秒..."
sleep 3

# 发送测试请求
echo "  发送 HTTP 请求..."
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)

echo ""
if [ "$HTTP_CODE" = "200" ]; then
    echo -e "${GREEN}✅ 压缩功能测试成功！${NC}"
    echo -e "${GREEN}Rust 客户端与 Rust 服务端在启用压缩的情况下完全兼容！${NC}"
    echo ""
    echo "响应内容（前 5 行）:"
    echo "$HTTP_RESPONSE" | head -n 5
    SUCCESS=true
else
    echo -e "${RED}❌ 压缩功能测试失败${NC}"
    echo "HTTP 状态码: $HTTP_CODE"
    echo "响应:"
    echo "$HTTP_RESPONSE" | head -n 10
    SUCCESS=false
fi
echo ""

# 查看日志
echo -e "${YELLOW}=== 日志信息 ===${NC}"
echo ""
echo -e "${YELLOW}Rust 服务端日志 (最后 10 行):${NC}"
tail -n 10 /tmp/rust-server-comp.log 2>/dev/null || echo "无日志"
echo ""

echo -e "${YELLOW}Rust 客户端日志 (最后 10 行):${NC}"
tail -n 10 /tmp/rust-client-comp.log 2>/dev/null || echo "无日志"
echo ""

if [ "$SUCCESS" = true ]; then
    echo -e "${GREEN}=== 压缩功能测试通过 ===${NC}"
else
    echo -e "${RED}=== 压缩功能测试失败 ===${NC}"
    echo "详细日志:"
    echo "  Rust 服务端: /tmp/rust-server-comp.log"
    echo "  Rust 客户端: /tmp/rust-client-comp.log"
fi
