#!/bin/bash
# 区域管理 E2E 测试稳定性验证脚本
# Story 8.9: 连续运行 10 次测试验证稳定性

# 获取脚本所在目录并切换
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

# 初始化变量
PASSED=0
FAILED=0
TIMES=()
RESULTS=()
START_TIME=$(date +%s)

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志目录 - 使用绝对路径
LOG_DIR="$SCRIPT_DIR/test-results/stability"
mkdir -p "$LOG_DIR"

# 测试文件列表
TEST_FILES=(
  "tests/e2e/specs/admin/region-list.spec.ts"
  "tests/e2e/specs/admin/region-add.spec.ts"
  "tests/e2e/specs/admin/region-edit.spec.ts"
  "tests/e2e/specs/admin/region-delete.spec.ts"
  "tests/e2e/specs/admin/region-cascade.spec.ts"
)

echo -e "${BLUE}=== 区域管理 E2E 测试稳定性验证 ===${NC}"
echo "开始时间: $(date)"
echo "工作目录: $SCRIPT_DIR"
echo "日志目录: $LOG_DIR"
echo "测试文件: ${TEST_FILES[*]}"
echo "运行次数: 10"
echo ""

# 清理函数：杀死残留的浏览器进程
cleanup_processes() {
  echo -e "  ${YELLOW}清理残留进程...${NC}"
  # 杀死所有 chromium 进程（Playwright 使用的浏览器）
  pkill -9 chromium 2>/dev/null || true
  pkill -9 chrome 2>/dev/null || true
  # 等待进程完全退出
  sleep 2
  echo "  清理完成"
}

# 运行稳定性测试
for i in {1..10}; do
  echo -e "${BLUE}=== 运行 #$i ===${NC}"

  # 每次运行前清理残留进程（防止卡住）
  cleanup_processes

  START=$(date +%s)

  # 运行测试并保存日志
  LOG_FILE="$LOG_DIR/run-$i.log"

  # 导入环境变量并运行测试
  # 使用 E2E_BASE_URL 指向已运行的开发服务器（8080端口）
  # 添加 timeout 防止测试卡住（5分钟超时）
  (
    export E2E_BASE_URL=http://localhost:8080
    timeout 300 pnpm test:e2e:chromium "${TEST_FILES[@]}" > "$LOG_FILE" 2>&1
  )
  EXIT_CODE=$?

  # 检查结果
  if [ $EXIT_CODE -eq 0 ]; then
    RESULT=0
    PASSED=$((PASSED + 1))
    STATUS="${GREEN}通过${NC}"
  elif [ $EXIT_CODE -eq 124 ]; then
    RESULT=1
    FAILED=$((FAILED + 1))
    STATUS="${RED}超时${NC}"
    echo -e "  ${RED}⚠️ 测试超时（300秒），可能已卡住${NC}"
  else
    RESULT=1
    FAILED=$((FAILED + 1))
    STATUS="${RED}失败${NC}"
  fi

  # 每次运行后也要清理残留进程
  cleanup_processes

  END=$(date +%s)
  DURATION=$((END - START))
  TIMES+=($DURATION)
  RESULTS+=($RESULT)

  echo -e "  结果: $STATUS (耗时: ${DURATION}s)"

  # 提取测试统计信息
  if [ -f "$LOG_FILE" ]; then
    # 查找最终的测试结果摘要行
    if grep -q "passed" "$LOG_FILE"; then
      # 尝试多种方式提取测试结果
      PASSED_TESTS=$(grep -oP '\d+(?= passed)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "N/A")
      FAILED_TESTS=$(grep -oP '\d+(?= failed)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "0")
      SKIPPED_TESTS=$(grep -oP '\d+(?= skipped)' "$LOG_FILE" 2>/dev/null | tail -1 || echo "0")

      echo "  测试结果: 通过 $PASSED_TESTS, 失败 $FAILED_TESTS, 跳过 $SKIPPED_TESTS"
    else
      # 如果没有找到标准格式，尝试其他方式
      echo "  日志文件已创建，但无法解析标准测试结果格式"
    fi

    # 如果测试失败，显示错误摘要
    if [ $RESULT -ne 0 ]; then
      echo -e "  ${YELLOW}错误摘要:${NC}"
      grep -iE "error|failed|timeout|fatal" "$LOG_FILE" 2>/dev/null | head -5 | sed 's/^/    /' || echo "    无法提取错误信息"
    fi
  else
    echo "  ${YELLOW}警告: 日志文件未创建${NC}"
  fi

  echo ""
done

# 计算总时间
TOTAL_TIME=$(($(date +%s) - START_TIME))

# 计算统计信息
if [ $PASSED -gt 0 ]; then
  AVG_TIME=$(awk '{sum+=$1} END {print sum/NR}' <<< "${TIMES[@]}")
  MIN_TIME=$(printf "%s\n" "${TIMES[@]}" | sort -n | head -1)
  MAX_TIME=$(printf "%s\n" "${TIMES[@]}" | sort -n | tail -1)
fi

PASS_RATE=$((PASSED * 10))

# 输出总结
echo -e "${BLUE}=== 稳定性测试结果 ===${NC}"
echo -e "通过率: ${PASSED}/10 (${PASS_RATE}%)"
echo "失败次数: $FAILED"

if [ $PASSED -gt 0 ]; then
  echo "平均耗时: ${AVG_TIME}s"
  echo "最快耗时: ${MIN_TIME}s"
  echo "最慢耗时: ${MAX_TIME}s"
fi
echo "总耗时: ${TOTAL_TIME}s"

# 判断稳定性
echo ""
if [ $PASSED -eq 10 ]; then
  echo -e "${GREEN}✅ 100% 稳定性通过！Epic 8 完成！${NC}"
  exit 0
elif [ $PASSED -ge 9 ]; then
  echo -e "${YELLOW}⚠️ 90% 稳定性，建议分析失败原因${NC}"
  exit 1
else
  echo -e "${RED}❌ 稳定性不足 (<90%)，需要修复问题${NC}"
  exit 1
fi
