#!/bin/bash

# OAuth-DB CLI E2E 测试运行脚本
# 用法: ./run-cli-e2e.sh [test-name]

set -e

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

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}ℹ${NC} $1"
}

print_success() {
    echo -e "${GREEN}✓${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}⚠${NC} $1"
}

print_error() {
    echo -e "${RED}✗${NC} $1"
}

# 检查是否在 cli 目录
if [ ! -f "Cargo.toml" ]; then
    print_error "请在 cli 目录下运行此脚本"
    exit 1
fi

# 检查后端服务
check_backend() {
    print_info "检查后端服务..."
    if curl -s -f http://localhost:38080/health > /dev/null 2>&1; then
        print_success "后端服务运行中"
        return 0
    else
        print_warning "后端服务未运行"
        return 1
    fi
}

# 启动后端服务
start_backend() {
    print_info "启动后端服务..."
    cd ..
    docker compose -f docker-compose.e2e.yml up -d
    cd cli

    print_info "等待服务就绪..."
    local max_wait=60
    local waited=0
    while [ $waited -lt $max_wait ]; do
        if curl -s -f http://localhost:38080/health > /dev/null 2>&1; then
            print_success "后端服务已就绪"
            return 0
        fi
        sleep 2
        waited=$((waited + 2))
        echo -n "."
    done
    echo ""
    print_error "后端服务启动超时"
    return 1
}

# 停止后端服务
stop_backend() {
    print_info "停止后端服务..."
    cd ..
    docker compose -f docker-compose.e2e.yml down -v
    cd cli
    print_success "后端服务已停止"
}

# 运行测试
run_tests() {
    local test_name=$1

    if [ -z "$test_name" ]; then
        print_info "运行所有 CLI E2E 测试..."
        cargo test --test '*' -- --test-threads=1 --nocapture
    else
        print_info "运行测试: $test_name"
        cargo test --test "$test_name" -- --nocapture
    fi

    if [ $? -eq 0 ]; then
        print_success "测试通过"
        return 0
    else
        print_error "测试失败"
        return 1
    fi
}

# 主流程
main() {
    local test_name=$1
    local need_cleanup=false

    echo ""
    print_info "OAuth-DB CLI E2E 测试"
    echo ""

    # 检查后端服务
    if ! check_backend; then
        read -p "是否启动后端服务? (y/n) " -n 1 -r
        echo ""
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            if ! start_backend; then
                exit 1
            fi
            need_cleanup=true
        else
            print_error "需要后端服务才能运行测试"
            exit 1
        fi
    fi

    # 运行测试
    if run_tests "$test_name"; then
        test_result=0
    else
        test_result=1
    fi

    # 清理
    if [ "$need_cleanup" = true ]; then
        echo ""
        read -p "是否停止后端服务? (y/n) " -n 1 -r
        echo ""
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            stop_backend
        fi
    fi

    echo ""
    if [ $test_result -eq 0 ]; then
        print_success "所有测试完成"
    else
        print_error "部分测试失败"
    fi

    exit $test_result
}

# 显示帮助
show_help() {
    cat << EOF
OAuth-DB CLI E2E 测试运行脚本

用法:
  ./run-cli-e2e.sh [test-name]

示例:
  ./run-cli-e2e.sh              # 运行所有测试
  ./run-cli-e2e.sh e2e_basic    # 运行基础功能测试
  ./run-cli-e2e.sh e2e_config   # 运行配置管理测试

可用的测试:
  e2e_basic    - 基础功能测试
  e2e_config   - 配置管理测试
  e2e_auth     - 认证功能测试 (待实现)
  e2e_app      - 应用管理测试 (待实现)
  e2e_user     - 用户管理测试 (待实现)
  e2e_admin    - 平台管理测试 (待实现)
  e2e_errors   - 错误处理测试 (待实现)

选项:
  -h, --help   显示此帮助信息

EOF
}

# 解析参数
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    show_help
    exit 0
fi

# 运行主流程
main "$1"
