#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据库配置管理
用于管理MySQL数据库连接配置
"""

import configparser
import os
from typing import Dict, Any

class DatabaseConfig:
    """数据库配置管理类"""
    
    def __init__(self, config_file: str = "database/config/database_config.ini"):
        """
        初始化配置管理器
        
        Args:
            config_file: 配置文件路径
        """
        self.config_file = config_file
        self.config = configparser.ConfigParser()
        
        # 如果配置文件不存在，创建默认配置
        if not os.path.exists(config_file):
            self.create_default_config()
        
        self.load_config()
    
    def create_default_config(self):
        """创建默认配置文件"""
        self.config['mysql'] = {
            'host': 'localhost',
            'port': '3306',
            'user': 'root',
            'password': '',  # 用户需要填入实际密码
            'database': 'callback_system',
            'charset': 'utf8mb4'
        }
        
        with open(self.config_file, 'w', encoding='utf-8') as f:
            f.write("""# 回访记录系统数据库配置文件
# 请根据您的MySQL数据库实际情况修改以下配置

""")
            self.config.write(f)
        
        print(f"已创建默认配置文件: {self.config_file}")
        print("请编辑此文件，填入您的MySQL数据库连接信息")
    
    def load_config(self):
        """加载配置文件"""
        try:
            self.config.read(self.config_file, encoding='utf-8')
        except Exception as e:
            print(f"加载配置文件失败: {e}")
            raise
    
    def get_mysql_config(self) -> Dict[str, Any]:
        """
        获取MySQL配置
        优先使用环境变量，其次使用配置文件
        
        Returns:
            MySQL连接配置字典
        """
        # 优先使用环境变量
        if os.getenv('DB_HOST'):
            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')
            }
            print(f"使用Docker环境变量配置: {mysql_config['host']}:{mysql_config['port']}")
            return mysql_config
        
        # 使用配置文件
        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 update_config(self, section: str, key: str, value: str):
        """
        更新配置项
        
        Args:
            section: 配置段名
            key: 配置项名
            value: 配置值
        """
        if section not in self.config:
            self.config.add_section(section)
        
        self.config[section][key] = value
        
        with open(self.config_file, 'w', encoding='utf-8') as f:
            self.config.write(f)
        
        print(f"配置已更新: [{section}] {key} = {value}")


def main():
    """主函数 - 配置向导"""
    print("=== 回访记录系统数据库配置向导 ===\n")
    
    config_manager = DatabaseConfig()
    
    if config_manager.validate_config():
        print("✓ 配置文件验证通过")
        config = config_manager.get_mysql_config()
        print(f"当前配置:")
        print(f"  主机: {config['host']}")
        print(f"  端口: {config['port']}")
        print(f"  用户: {config['user']}")
        print(f"  数据库: {config['database']}")
        print(f"  字符集: {config['charset']}")
    else:
        print("✗ 配置文件验证失败")
        print(f"请编辑配置文件: {config_manager.config_file}")
        
        # 提供交互式配置
        print("\n是否要现在配置数据库连接信息？(y/n): ", end="")
        if input().lower() == 'y':
            print("\n请输入MySQL数据库连接信息:")
            
            host = input("主机地址 (默认: localhost): ").strip() or "localhost"
            port = input("端口 (默认: 3306): ").strip() or "3306"
            user = input("用户名 (默认: root): ").strip() or "root"
            password = input("密码: ").strip()
            database = input("数据库名 (默认: callback_system): ").strip() or "callback_system"
            
            # 更新配置
            config_manager.update_config('mysql', 'host', host)
            config_manager.update_config('mysql', 'port', port)
            config_manager.update_config('mysql', 'user', user)
            config_manager.update_config('mysql', 'password', password)
            config_manager.update_config('mysql', 'database', database)
            
            print("\n配置已保存！")


if __name__ == "__main__":
    main() 