"""
Database Client - 数据库客户端配置和初始化

统一管理数据库连接配置和实例，支持 SQLite 和 PostgreSQL 等多种数据库后端。
未来切换数据库只需修改环境变量，无需修改代码。
"""
import os
import logging
from flask_sqlalchemy import SQLAlchemy

logger = logging.getLogger(__name__)

# --- 数据库实例 ---
# 全局共享的 SQLAlchemy 实例，供模型层导入使用
db = SQLAlchemy()


def init_database(app):
    """
    初始化数据库连接配置并绑定到 Flask 应用
    
    从环境变量读取数据库配置，支持 SQLite 和 PostgreSQL。
    
    Args:
        app: Flask 应用实例
    
    配置项：
        SQLALCHEMY_DATABASE_URI: 数据库连接字符串
        SQLALCHEMY_TRACK_MODIFICATIONS: 是否追踪对象修改（默认关闭以节省内存）
        SQLALCHEMY_ENGINE_OPTIONS: 引擎选项（连接池、超时等）
    """
    # --- 数据库连接配置 ---
    # 优先从环境变量读取，支持 SQLite 和 PostgreSQL
    database_uri = os.environ.get(
        'SQLALCHEMY_DATABASE_URI',
        'sqlite:///data/instance/transcriptions.db'
    )
    app.config['SQLALCHEMY_DATABASE_URI'] = database_uri
    
    # 关闭 SQLAlchemy 的修改追踪（节省内存）
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    
    # --- 引擎选项（连接池配置）---
    # 适用于 SQLite 和 PostgreSQL
    engine_options = {
        'pool_pre_ping': True,  # 连接前检查连接是否有效
    }
    
    # PostgreSQL 特有的连接池配置
    if database_uri.startswith('postgresql'):
        engine_options.update({
            'pool_size': int(os.environ.get('DB_POOL_SIZE', '10')),  # 连接池大小
            'max_overflow': int(os.environ.get('DB_MAX_OVERFLOW', '20')),  # 最大溢出连接数
            'pool_timeout': int(os.environ.get('DB_POOL_TIMEOUT', '30')),  # 获取连接超时时间（秒）
            'pool_recycle': int(os.environ.get('DB_POOL_RECYCLE', '3600')),  # 连接回收时间（秒）
        })
        logger.info(f"数据库已配置为 PostgreSQL，连接池大小：{engine_options['pool_size']}")
    else:
        # SQLite 使用静态池（单线程）
        engine_options['poolclass'] = None  # 让 SQLAlchemy 自动选择
        logger.info(f"数据库已配置为 SQLite：{database_uri}")
    
    app.config['SQLALCHEMY_ENGINE_OPTIONS'] = engine_options
    
    # --- 绑定到 Flask 应用 ---
    db.init_app(app)
    
    logger.info("数据库配置初始化完成")


def get_database_uri():
    """
    获取当前数据库连接字符串
    
    Returns:
        str: 数据库连接 URI
    """
    return os.environ.get(
        'SQLALCHEMY_DATABASE_URI',
        'sqlite:///data/instance/transcriptions.db'
    )


def is_postgresql():
    """
    检查当前是否使用 PostgreSQL 数据库
    
    Returns:
        bool: 如果是 PostgreSQL 返回 True
    """
    return get_database_uri().startswith('postgresql')
