#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据库等待脚本
等待MySQL数据库完全启动并可连接后再继续
"""

import os
import sys
import time
import pymysql
from datetime import datetime

def get_db_config():
    """获取数据库配置"""
    return {
        'host': os.getenv('DB_HOST', 'mysql'),
        'port': int(os.getenv('DB_PORT', 3306)),
        'user': os.getenv('DB_USER', 'callback_user'),
        'password': os.getenv('DB_PASSWORD', 'dev_password_123'),
        'database': os.getenv('DB_NAME', 'callback_system'),
        'charset': os.getenv('DB_CHARSET', 'utf8mb4')
    }

def test_connection(config, max_retries=30, retry_interval=2):
    """
    测试数据库连接
    
    Args:
        config: 数据库配置
        max_retries: 最大重试次数
        retry_interval: 重试间隔（秒）
    
    Returns:
        bool: 连接是否成功
    """
    print(f"🔍 等待数据库连接就绪...")
    print(f"📍 数据库地址: {config['host']}:{config['port']}")
    if 'database' in config:
        print(f"📍 数据库名称: {config['database']}")
    print(f"📍 最大重试次数: {max_retries}")
    
    for attempt in range(1, max_retries + 1):
        try:
            print(f"⏳ 尝试连接数据库 ({attempt}/{max_retries})...")
            
            # 尝试连接数据库
            connection = pymysql.connect(**config)
            
            # 测试基本查询
            with connection.cursor() as cursor:
                cursor.execute("SELECT 1")
                result = cursor.fetchone()
                
            connection.close()
            
            if result:
                print(f"✅ 数据库连接成功！(耗时: {(attempt-1) * retry_interval}秒)")
                return True
                
        except pymysql.Error as e:
            error_code = getattr(e, 'args', [None])[0]
            
            # 常见的连接错误
            if error_code in [2003, 2006, 2013]:  # 连接被拒绝、连接丢失、连接超时
                print(f"⏳ 数据库尚未就绪，等待 {retry_interval} 秒后重试...")
            elif error_code == 1049:  # 数据库不存在
                print(f"❌ 数据库 '{config['database']}' 不存在")
                return False
            elif error_code == 1045:  # 访问被拒绝
                print(f"❌ 数据库认证失败，请检查用户名和密码")
                return False
            else:
                print(f"❌ 数据库连接错误: {e}")
            
            if attempt < max_retries:
                time.sleep(retry_interval)
            else:
                print(f"❌ 数据库连接失败，已达到最大重试次数 ({max_retries})")
                return False
                
        except Exception as e:
            print(f"❌ 未知错误: {e}")
            if attempt < max_retries:
                time.sleep(retry_interval)
            else:
                return False
    
    return False

def check_database_exists(config):
    """检查数据库是否存在"""
    try:
        # 连接到MySQL服务器（不指定数据库）
        server_config = config.copy()
        del server_config['database']
        
        connection = pymysql.connect(**server_config)
        
        with connection.cursor() as cursor:
            cursor.execute("SHOW DATABASES LIKE %s", (config['database'],))
            result = cursor.fetchone()
            
        connection.close()
        
        if result:
            print(f"✅ 数据库 '{config['database']}' 存在")
            return True
        else:
            print(f"❌ 数据库 '{config['database']}' 不存在")
            return False
            
    except Exception as e:
        print(f"❌ 检查数据库存在性失败: {e}")
        return False

def create_database_if_not_exists(config):
    """如果数据库不存在则创建"""
    try:
        # 连接到MySQL服务器（不指定数据库）
        server_config = config.copy()
        del server_config['database']
        
        connection = pymysql.connect(**server_config)
        
        with connection.cursor() as cursor:
            # 创建数据库
            cursor.execute(f"""
                CREATE DATABASE IF NOT EXISTS `{config['database']}` 
                CHARACTER SET utf8mb4 
                COLLATE utf8mb4_unicode_ci
            """)
            print(f"✅ 数据库 '{config['database']}' 创建成功")
            
        connection.close()
        return True
        
    except Exception as e:
        print(f"❌ 创建数据库失败: {e}")
        return False

def main():
    """主函数"""
    print("🚀 数据库等待脚本启动")
    print(f"🕐 启动时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    # 获取数据库配置
    config = get_db_config()
    
    # 首先等待MySQL服务器启动
    print("\n📋 第一步：等待MySQL服务器启动...")
    server_config = config.copy()
    del server_config['database']
    
    if not test_connection(server_config):
        print("❌ MySQL服务器连接失败")
        sys.exit(1)
    
    # 检查并创建数据库
    print("\n📋 第二步：检查数据库存在性...")
    if not check_database_exists(config):
        print("📋 数据库不存在，尝试创建...")
        if not create_database_if_not_exists(config):
            print("❌ 数据库创建失败")
            sys.exit(1)
    
    # 测试完整的数据库连接
    print("\n📋 第三步：测试完整数据库连接...")
    if not test_connection(config):
        print("❌ 数据库连接失败")
        sys.exit(1)
    
    print("\n🎉 数据库就绪！可以开始应用启动流程")
    print(f"🕐 完成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    return 0

if __name__ == "__main__":
    sys.exit(main())
