#!/bin/bash

# ============================================================================
# Crawlful Hub 环境配置脚本
# Task ID: OP-DE001
# Description: 环境变量配置与验证脚本
# ============================================================================

set -e

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

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 环境变量配置模板
ENV_TEMPLATE="# ============================================================================
# Crawlful Hub 环境变量配置
# ============================================================================

# 应用配置
NODE_ENV=development
APP_PORT=3000
APP_NAME=crawlful-hub

# 数据库配置 (阿里云 RDS MySQL 8.0)
DB_HOST=localhost
DB_PORT=3306
DB_NAME=crawlful_hub
DB_USER=root
DB_PASSWORD=your_password_here
DB_POOL_MIN=5
DB_POOL_MAX=20

# Redis 配置 (本地 Redis 6379)
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0

# JWT 配置
JWT_SECRET=your_jwt_secret_here
JWT_EXPIRES_IN=7d

# 租户配置
DEFAULT_TENANT_ID=tenant_001

# 日志配置
LOG_LEVEL=info
LOG_FORMAT=json

# 五元组追踪
TRACE_ENABLED=true
TRACE_SAMPLE_RATE=1.0

# 利润红线配置
PROFIT_MARGIN_B2B_THRESHOLD=0.15
PROFIT_MARGIN_B2C_THRESHOLD=0.20

# 并发控制
WORKER_CONCURRENCY=10
API_RATE_LIMIT=100

# 内存限制 (MB)
NODE_MAX_OLD_SPACE_SIZE=4096

# 插件配置
PLUGIN_DATA_DIR=./data/plugins
PLUGIN_PROFILE_DIR=./data/profiles

# 安全配置
CORS_ORIGIN=http://localhost:8000
HELMET_ENABLED=true
"

# 创建 .env 文件
create_env_file() {
    local env_file=".env"
    
    if [ -f "$env_file" ]; then
        log_warn ".env 文件已存在，跳过创建"
        return 0
    fi
    
    log_info "创建 .env 文件..."
    echo "$ENV_TEMPLATE" > "$env_file"
    log_success ".env 文件创建成功"
}

# 创建 .env.example 文件
create_env_example() {
    local env_example=".env.example"
    
    log_info "创建 .env.example 文件..."
    echo "$ENV_TEMPLATE" > "$env_example"
    log_success ".env.example 文件创建成功"
}

# 验证环境变量
validate_env() {
    log_info "验证环境变量..."
    
    local missing_vars=()
    local required_vars=(
        "NODE_ENV"
        "DB_HOST"
        "DB_PORT"
        "DB_NAME"
        "DB_USER"
        "REDIS_HOST"
        "REDIS_PORT"
        "JWT_SECRET"
    )
    
    for var in "${required_vars[@]}"; do
        if [ -z "${!var}" ]; then
            missing_vars+=("$var")
        fi
    done
    
    if [ ${#missing_vars[@]} -gt 0 ]; then
        log_error "缺少必要的环境变量: ${missing_vars[*]}"
        return 1
    fi
    
    log_success "所有必要的环境变量已配置"
    return 0
}

# 验证数据库连接
validate_db_connection() {
    log_info "验证数据库连接..."
    
    if command -v mysql &> /dev/null; then
        if mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASSWORD}" -e "SELECT 1" &> /dev/null; then
            log_success "数据库连接成功"
            return 0
        else
            log_warn "数据库连接失败，请检查配置"
            return 1
        fi
    else
        log_warn "mysql 客户端未安装，跳过数据库连接验证"
        return 0
    fi
}

# 验证 Redis 连接
validate_redis_connection() {
    log_info "验证 Redis 连接..."
    
    if command -v redis-cli &> /dev/null; then
        if redis-cli -h"${REDIS_HOST}" -p"${REDIS_PORT}" ping &> /dev/null; then
            log_success "Redis 连接成功"
            return 0
        else
            log_warn "Redis 连接失败，请检查配置"
            return 1
        fi
    else
        log_warn "redis-cli 未安装，跳过 Redis 连接验证"
        return 0
    fi
}

# 创建必要的目录
create_directories() {
    log_info "创建必要的目录..."
    
    local directories=(
        "./logs"
        "./data"
        "./data/plugins"
        "./data/profiles"
        "./data/uploads"
        "./data/backups"
        "./tmp"
    )
    
    for dir in "${directories[@]}"; do
        if [ ! -d "$dir" ]; then
            mkdir -p "$dir"
            log_success "创建目录: $dir"
        else
            log_info "目录已存在: $dir"
        fi
    done
}

# 设置文件权限
set_permissions() {
    log_info "设置文件权限..."
    
    chmod 700 ./data
    chmod 700 ./data/plugins
    chmod 700 ./data/profiles
    chmod 600 .env 2>/dev/null || true
    
    log_success "文件权限设置完成"
}

# 检查 Node.js 版本
check_node_version() {
    log_info "检查 Node.js 版本..."
    
    if command -v node &> /dev/null; then
        local node_version=$(node -v | cut -d 'v' -f 2 | cut -d '.' -f 1)
        if [ "$node_version" -ge 18 ]; then
            log_success "Node.js 版本: $(node -v)"
        else
            log_error "Node.js 版本过低，需要 >= 18.x"
            return 1
        fi
    else
        log_error "Node.js 未安装"
        return 1
    fi
}

# 检查依赖
check_dependencies() {
    log_info "检查依赖..."
    
    local missing_deps=()
    local deps=("node" "npm")
    
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &> /dev/null; then
            missing_deps+=("$dep")
        fi
    done
    
    if [ ${#missing_deps[@]} -gt 0 ]; then
        log_error "缺少依赖: ${missing_deps[*]}"
        return 1
    fi
    
    log_success "所有依赖已安装"
    return 0
}

# 显示配置摘要
show_summary() {
    echo ""
    echo "=========================================="
    echo "       Crawlful Hub 环境配置摘要"
    echo "=========================================="
    echo ""
    echo "应用配置:"
    echo "  - NODE_ENV: ${NODE_ENV:-未设置}"
    echo "  - APP_PORT: ${APP_PORT:-未设置}"
    echo ""
    echo "数据库配置:"
    echo "  - DB_HOST: ${DB_HOST:-未设置}"
    echo "  - DB_PORT: ${DB_PORT:-未设置}"
    echo "  - DB_NAME: ${DB_NAME:-未设置}"
    echo ""
    echo "Redis 配置:"
    echo "  - REDIS_HOST: ${REDIS_HOST:-未设置}"
    echo "  - REDIS_PORT: ${REDIS_PORT:-未设置}"
    echo ""
    echo "业务约束:"
    echo "  - B2B 利润红线: ${PROFIT_MARGIN_B2B_THRESHOLD:-15%}"
    echo "  - B2C 利润红线: ${PROFIT_MARGIN_B2C_THRESHOLD:-20%}"
    echo "  - Worker 并发数: ${WORKER_CONCURRENCY:-10}"
    echo ""
    echo "=========================================="
}

# 主函数
main() {
    echo ""
    echo "=========================================="
    echo "   Crawlful Hub 环境配置脚本 v1.0"
    echo "=========================================="
    echo ""
    
    # 加载环境变量
    if [ -f ".env" ]; then
        log_info "加载 .env 文件..."
        export $(cat .env | grep -v '^#' | xargs)
    fi
    
    # 执行配置步骤
    create_env_file
    create_env_example
    create_directories
    set_permissions
    check_node_version
    check_dependencies
    
    # 验证连接
    if [ -f ".env" ]; then
        validate_db_connection || true
        validate_redis_connection || true
    fi
    
    # 显示摘要
    show_summary
    
    log_success "环境配置完成！"
}

# 运行主函数
main "$@"
