#!/bin/bash

# 数据库连接问题修复脚本

echo "=== 数据库连接问题修复工具 ==="

# 检查当前目录
if [ ! -f "main.py" ]; then
    echo "错误: 请在包含main.py的项目根目录下运行此脚本"
    exit 1
fi

echo "当前目录: $(pwd)"

# 1. 检查.env文件
echo ""
echo "1. 检查环境配置..."

if [ -f ".env" ]; then
    echo "✓ .env 文件存在"
    echo "当前数据库配置:"
    grep "DATABASE_URL" .env || echo "DATABASE_URL 未设置"
else
    echo "⚠ .env 文件不存在，正在创建..."
    cat > .env << EOF
# 基础配置
ENVIRONMENT=production
DEBUG=false

# 数据库配置 - 请根据实际情况修改
DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db

# Redis配置
REDIS_URL=redis://localhost:6379

# JWT配置
JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production-$(date +%s)
JWT_ALGORITHM=HS256
JWT_EXPIRE_MINUTES=30

# 文件上传配置
UPLOAD_DIR=uploads
MAX_FILE_SIZE=10485760

# CORS配置
ALLOWED_HOSTS=["*"]
EOF
    echo "✓ .env 文件创建成功"
fi

# 2. 测试数据库连接
echo ""
echo "2. 测试数据库连接..."

# 创建测试脚本
cat > test_db_connection.py << 'EOF'
#!/usr/bin/env python3
import sys
import os
sys.path.insert(0, '.')

try:
    from app.core.config import settings
    print(f"✓ 配置加载成功")
    print(f"数据库URL: {settings.DATABASE_URL}")

    # 测试数据库连接
    from sqlalchemy import create_engine, text
    engine = create_engine(settings.DATABASE_URL)

    with engine.connect() as conn:
        result = conn.execute(text("SELECT VERSION()"))
        version = result.fetchone()[0]
        print(f"✓ 数据库连接成功: MySQL {version}")

        # 检查数据库是否存在
        result = conn.execute(text("SHOW DATABASES LIKE 'mytest_db'"))
        if result.fetchone():
            print("✓ 数据库 'mytest_db' 存在")
        else:
            print("⚠ 数据库 'mytest_db' 不存在，需要创建")

except ImportError as e:
    print(f"✗ 导入错误: {e}")
    print("请确保已安装所需依赖: pip install sqlalchemy pymysql")
    sys.exit(1)
except Exception as e:
    print(f"✗ 数据库连接失败: {e}")
    print("")
    print "可能的原因:"
    print "1. 数据库服务器未启动"
    print "2. 网络连接问题"
    print "3. 用户名或密码错误"
    print "4. 数据库不存在"
    print "5. 防火墙阻止连接"
    sys.exit(1)
EOF

python3 test_db_connection.py

if [ $? -eq 0 ]; then
    echo ""
    echo "✓ 数据库连接测试通过"
else
    echo ""
    echo "✗ 数据库连接测试失败"
    echo ""
    echo "解决方案:"
    echo "1. 检查数据库服务是否运行"
    echo "2. 验证数据库连接参数"
    echo "3. 确认网络连通性"
    echo ""
    echo "请手动编辑 .env 文件中的 DATABASE_URL"
    echo "格式: mysql+pymysql://用户名:密码@主机:端口/数据库名"
    exit 1
fi

# 3. 检查Docker环境
echo ""
echo "3. 检查Docker配置..."

if [ -f "docker-compose.yml" ]; then
    echo "✓ 发现 docker-compose.yml 文件"
    echo "检查Docker数据库配置..."

    if grep -q "mysql:" docker-compose.yml; then
        echo "⚠ 检测到Docker MySQL配置"
        echo "如果使用Docker Compose，请确保:"
        echo "1. 数据库服务已启动: docker-compose up -d mysql"
        echo "2. 数据库主机名应为 'mysql' (服务名)"
        echo "3. 确认网络配置正确"

        echo ""
        echo "Docker数据库连接配置示例:"
        echo "DATABASE_URL=mysql+pymysql://root:password@mysql:3306/mytest_db"
    fi
fi

# 4. 提供修复建议
echo ""
echo "4. 修复建议..."

echo "根据错误信息，应用尝试连接到 'mysql' 主机，但配置中是IP地址。"
echo "请检查以下配置:"
echo ""

echo "选项1: 使用外部数据库 (推荐)"
echo "DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db"
echo ""

echo "选项2: 使用Docker数据库"
echo "DATABASE_URL=mysql+pymysql://root:password@mysql:3306/mytest_db"
echo ""

echo "选项3: 使用本地数据库"
echo "DATABASE_URL=mysql+pymysql://root:password@localhost:3306/mytest_db"
echo ""

# 5. 自动修复.env文件
echo "5. 自动修复配置..."
if [ -f ".env" ]; then
    # 备份原文件
    cp .env .env.backup.$(date +%Y%m%d_%H%M%S)

    # 确保使用正确的数据库URL
    if grep -q "DATABASE_URL.*mysql.*mysql:" .env; then
        echo "检测到Docker主机名配置，更新为外部数据库..."
        sed -i 's|DATABASE_URL=mysql+pymysql://.*@mysql:.*|DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db|' .env
    elif ! grep -q "DATABASE_URL.*101.126.85.76" .env; then
        echo "更新数据库连接配置..."
        sed -i 's|DATABASE_URL=.*|DATABASE_URL=mysql+pymysql://mytest_db:mytest_db@101.126.85.76:3306/mytest_db|' .env
    fi

    echo "✓ 数据库配置已更新"
fi

# 6. 重启应用提示
echo ""
echo "6. 重启应用..."
echo "配置更新完成，请重启应用以使配置生效"
echo ""
echo "重启方式:"
echo "1. 停止当前应用 (Ctrl+C)"
echo "2. 重新启动: python main.py"
echo "3. 或者使用启动脚本: ./start_app.sh"

echo ""
echo "=== 数据库连接修复完成 ==="
echo ""
echo "如果问题仍然存在，请:"
echo "1. 确认数据库服务器地址正确: 101.126.85.76:3306"
echo "2. 确认用户名密码正确: mytest_db / mytest_db"
echo "3. 确认数据库名称正确: mytest_db"
echo "4. 测试网络连通性: telnet 101.126.85.76 3306"