#!/bin/bash
# OAuth-DB CLI E2E 测试环境启动脚本
# 用途：启动 Docker Compose E2E 环境并等待服务就绪

set -e

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

# 打印函数
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"
}

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

# 检查 docker-compose.debug.yml 是否存在
if [ ! -f "$CLI_DIR/docker-compose.debug.yml" ]; then
    print_error "docker-compose.debug.yml 不存在"
    exit 1
fi

# 检查 RSA 密钥是否存在
if [ ! -f "$CLI_DIR/../keys/private.pem" ]; then
    print_warning "RSA 密钥不存在，正在生成..."
    mkdir -p "$CLI_DIR/../keys"
    openssl genrsa -out "$CLI_DIR/../keys/private.pem" 2048
    openssl rsa -in "$CLI_DIR/../keys/private.pem" -pubout -out "$CLI_DIR/../keys/public.pem"
    print_success "RSA 密钥生成完成"
fi

# 检查 config.e2e.yaml 是否存在
if [ ! -f "$CLI_DIR/../config.e2e.yaml" ]; then
    print_error "config.e2e.yaml 不存在"
    exit 1
fi

# 检查 migrations 目录是否存在
if [ ! -d "$CLI_DIR/../apps/migrations" ]; then
    print_error "apps/migrations 目录不存在"
    exit 1
fi

# 检查后端镜像是否存在
if ! docker image inspect oauth-db:latest > /dev/null 2>&1; then
    print_warning "oauth-db:latest 镜像不存在，正在构建..."
    cd "$CLI_DIR/.."
    docker build -t oauth-db:latest -f Dockerfile .
    cd "$CLI_DIR"
    print_success "后端镜像构建完成"
fi

print_info "启动 E2E 测试环境..."
cd "$CLI_DIR"
docker compose -f docker-compose.debug.yml up -d

print_info "等待服务就绪..."

# 等待 PostgreSQL
print_info "等待 PostgreSQL..."
max_wait=60
waited=0
while [ $waited -lt $max_wait ]; do
    if docker compose -f docker-compose.debug.yml exec -T e2e-postgresql pg_isready -U oauth -d oauth_db > /dev/null 2>&1; then
        print_success "PostgreSQL 已就绪"
        break
    fi
    sleep 2
    waited=$((waited + 2))
    echo -n "."
done
echo ""

if [ $waited -ge $max_wait ]; then
    print_error "PostgreSQL 启动超时"
    exit 1
fi

# 等待 Redis
print_info "等待 Redis..."
waited=0
while [ $waited -lt $max_wait ]; do
    if docker compose -f docker-compose.debug.yml exec -T e2e-redis redis-cli ping > /dev/null 2>&1; then
        print_success "Redis 已就绪"
        break
    fi
    sleep 2
    waited=$((waited + 2))
    echo -n "."
done
echo ""

if [ $waited -ge $max_wait ]; then
    print_error "Redis 启动超时"
    exit 1
fi

# 等待 OAuth-DB 后端
print_info "等待 OAuth-DB 后端..."
waited=0
while [ $waited -lt $max_wait ]; do
    if curl -s -f http://localhost:28080/health > /dev/null 2>&1; then
        print_success "OAuth-DB 后端已就绪"
        break
    fi
    sleep 2
    waited=$((waited + 2))
    echo -n "."
done
echo ""

if [ $waited -ge $max_wait ]; then
    print_error "OAuth-DB 后端启动超时"
    print_info "查看后端日志："
    docker compose -f docker-compose.debug.yml logs e2e-oauth-db
    exit 1
fi

print_success "E2E 测试环境启动完成"
print_info "服务端点："
print_info "  - OAuth-DB API: http://localhost:28080"
print_info "  - PostgreSQL: localhost:25432"
print_info "  - Redis: localhost:26379"
print_info "  - SurrealDB: localhost:28000"
print_info "  - gsc-debugger: localhost:25555"

echo ""
print_info "运行测试："
print_info "  cd $CLI_DIR"
print_info "  cargo test --test '*' -- --test-threads=1"

echo ""
print_info "停止环境："
print_info "  cd $CLI_DIR"
print_info "  ./tests/e2e_teardown.sh"
