#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Docker环境数据库配置管理
支持环境变量配置，用于Docker部署
"""

import os
import configparser
from typing import Dict, Any

class DockerDatabaseConfig:
    """Docker环境数据库配置管理类"""
    
    def __init__(self, config_file: str = "database_config.ini"):
        """
        初始化配置管理器
        
        Args:
            config_file: 配置文件路径（可选，Docker环境优先使用环境变量）
        """
        self.config_file = config_file
        self.config = configparser.ConfigParser()
        
        # 优先使用环境变量，如果不存在则尝试读取配置文件
        if self._has_env_config():
            print("使用环境变量配置数据库连接")
        elif os.path.exists(config_file):
            print(f"使用配置文件: {config_file}")
            self.load_config()
        else:
            print("未找到配置文件，将使用默认配置和环境变量")
            self.create_default_config()
    
    def _has_env_config(self) -> bool:
        """检查是否有完整的环境变量配置"""
        required_env_vars = ['DB_HOST', 'DB_USER', 'DB_NAME']
        return all(os.getenv(var) for var in required_env_vars)
    
    def create_default_config(self):
        """创建默认配置文件"""
        self.config['mysql'] = {
            'host': os.getenv('DB_HOST', 'localhost'),
            'port': os.getenv('DB_PORT', '3306'),
            'user': os.getenv('DB_USER', 'root'),
            'password': os.getenv('DB_PASSWORD', ''),
            'database': os.getenv('DB_NAME', 'callback_system'),
            'charset': os.getenv('DB_CHARSET', 'utf8mb4')
        }
        
        # 如果不是Docker环境，保存配置文件
        if not self._has_env_config():
            with open(self.config_file, 'w', encoding='utf-8') as f:
                f.write("""# 回访记录系统数据库配置文件
# Docker环境会优先使用环境变量配置

""")
                self.config.write(f)
            print(f"已创建默认配置文件: {self.config_file}")
    
    def load_config(self):
        """从配置文件加载配置"""
        try:
            self.config.read(self.config_file, encoding='utf-8')
        except Exception as e:
            print(f"加载配置文件失败: {e}")
            self.create_default_config()
    
    def get_mysql_config(self) -> Dict[str, Any]:
        """
        获取MySQL配置
        优先使用环境变量，其次使用配置文件
        
        Returns:
            MySQL连接配置字典
        """
        # 优先使用环境变量
        if self._has_env_config():
            mysql_config = {
                'host': os.getenv('DB_HOST'),
                'port': int(os.getenv('DB_PORT', '3306')),
                'user': os.getenv('DB_USER'),
                'password': os.getenv('DB_PASSWORD', ''),
                'database': os.getenv('DB_NAME'),
                'charset': os.getenv('DB_CHARSET', 'utf8mb4')
            }
        else:
            # 使用配置文件
            if 'mysql' not in self.config:
                raise ValueError("配置文件中未找到mysql配置段")
            
            mysql_config = dict(self.config['mysql'])
            mysql_config['port'] = int(mysql_config.get('port', 3306))
        
        return mysql_config
    
    def validate_config(self) -> bool:
        """
        验证配置是否完整
        
        Returns:
            配置有效返回True
        """
        try:
            config = self.get_mysql_config()
            required_fields = ['host', 'port', 'user', 'database']
            
            for field in required_fields:
                if not config.get(field):
                    print(f"配置项 {field} 缺失或为空")
                    return False
            
            if not config.get('password'):
                print("警告：数据库密码为空，如果数据库需要密码，请在配置文件中设置")
            
            return True
            
        except Exception as e:
            print(f"配置验证失败: {e}")
            return False
    
    def test_connection(self) -> bool:
        """
        测试数据库连接
        
        Returns:
            连接成功返回True
        """
        try:
            import pymysql
            config = self.get_mysql_config()
            
            print(f"正在测试数据库连接...")
            print(f"主机: {config['host']}:{config['port']}")
            print(f"用户: {config['user']}")
            print(f"数据库: {config['database']}")
            
            connection = pymysql.connect(**config)
            
            with connection.cursor() as cursor:
                cursor.execute("SELECT VERSION()")
                version = cursor.fetchone()
                print(f"数据库连接成功！MySQL版本: {version[0]}")
            
            connection.close()
            return True
            
        except ImportError:
            print("错误：未安装pymysql库")
            print("请运行: pip install pymysql")
            return False
        except Exception as e:
            print(f"数据库连接失败: {e}")
            return False
    
    def print_config_info(self):
        """打印配置信息"""
        print("\n=== 数据库配置信息 ===")
        try:
            config = self.get_mysql_config()
            print(f"配置来源: {'环境变量' if self._has_env_config() else '配置文件'}")
            print(f"主机: {config['host']}")
            print(f"端口: {config['port']}")
            print(f"用户: {config['user']}")
            print(f"数据库: {config['database']}")
            print(f"字符集: {config['charset']}")
            print(f"密码: {'已设置' if config.get('password') else '未设置'}")
        except Exception as e:
            print(f"获取配置信息失败: {e}")

def main():
    """主函数"""
    print("=== Docker数据库配置管理 ===")
    
    config_manager = DockerDatabaseConfig()
    
    # 显示配置信息
    config_manager.print_config_info()
    
    # 验证配置
    if not config_manager.validate_config():
        print("\n❌ 配置验证失败")
        return False
    
    # 测试连接
    if config_manager.test_connection():
        print("\n✅ 数据库配置正确，连接测试成功")
        return True
    else:
        print("\n❌ 数据库连接测试失败")
        return False

if __name__ == "__main__":
    main() 