"""
服务层初始化模块

负责初始化所有业务服务，包括：
- 音频分段服务
- 嵌入功能依赖检测
- 远程数据同步线程
- 文件监控服务
- 数据库表结构迁移
"""
import os
import tempfile
from sqlalchemy import text


# 全局服务实例
chunking_service = None


def init_early_services(app):
    """
    早期服务初始化（在蓝图注册前调用）
    
    初始化 chunking_service 和 EMBEDDINGS_AVAILABLE，
    这些服务需要在蓝图注册时可用。
    
    Args:
        app: Flask 应用实例
    """
    with app.app_context():
        _init_chunking_service(app)
        _check_embedding_dependencies(app)


def init_services(app):
    """
    初始化所有服务
    
    Args:
        app: Flask 应用实例
    """
    global chunking_service
    
    with app.app_context():
        # 1. 初始化音频分段服务
        _init_chunking_service(app)
        
        # 2. 检测嵌入功能依赖
        _check_embedding_dependencies(app)
        
        # 3. 启动远程数据同步线程
        _start_sync_thread_safely(app)
        
        # 4. 初始化文件监控
        _init_file_monitor(app)
        
        # 5. 执行数据库表结构迁移
        _migrate_database(app)


def _init_chunking_service(app):
    """初始化音频分段服务"""
    global chunking_service
    
    from src.services.audio_chunking import AudioChunkingService
    from src.config import ENABLE_CHUNKING
    
    if ENABLE_CHUNKING:
        chunking_service = AudioChunkingService()
        app.logger.info("音频分段服务已启用")
    else:
        chunking_service = None
        app.logger.info("音频分段服务已禁用")


def _check_embedding_dependencies(app):
    """检测嵌入功能依赖是否可用"""
    try:
        import numpy
        from sentence_transformers import SentenceTransformer
        from sklearn.metrics.pairwise import cosine_similarity
        
        app.config['EMBEDDINGS_AVAILABLE'] = True
        app.logger.info("✅ 嵌入功能依赖已就绪，语义搜索可用")
        
    except ImportError as e:
        app.config['EMBEDDINGS_AVAILABLE'] = False
        app.logger.warning(f"⚠️  嵌入功能依赖缺失，语义搜索不可用: {e}")
        app.logger.info("   启用语义搜索请安装: pip install sentence-transformers scikit-learn")


def _start_sync_thread_safely(app):
    """
    安全启动远程数据同步线程
    
    在 Gunicorn 多进程环境下，使用文件锁确保只有一个 Worker 启动同步线程。
    在 Windows 开发环境下，直接启动同步线程。
    """
    from src.services.sync_service import start_sync_thread
    
    enable_sync = os.environ.get('ENABLE_REMOTE_SYNC', 'false').lower() == 'true'
    
    if not enable_sync:
        app.logger.info("远程数据同步已禁用（设置 ENABLE_REMOTE_SYNC=true 以启用）")
        return
    
    try:
        # 尝试使用文件锁（Unix/Linux 环境）
        import fcntl
        
        lock_file_path = os.path.join(tempfile.gettempdir(), 'speakr_sync_worker.lock')
        lock_file = open(lock_file_path, 'w')
        
        try:
            # 尝试获取非阻塞排他锁
            fcntl.lockf(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
            
            # 成功获取锁，启动同步线程
            app.logger.info(f"当前 Worker (PID: {os.getpid()}) 获得同步锁，启动同步线程...")
            start_sync_thread(app)
            
        except (IOError, BlockingIOError):
            # 锁已被其他 Worker 持有
            app.logger.info(f"当前 Worker (PID: {os.getpid()}) 未获得锁，跳过同步线程启动")
            
    except ImportError:
        # Windows 环境，不支持 fcntl，直接启动
        app.logger.warning("当前环境不支持 fcntl（Windows），直接启动同步线程")
        start_sync_thread(app)
    
    except Exception as e:
        app.logger.error(f"启动同步线程失败: {e}")


def _init_file_monitor(app):
    """初始化文件监控服务"""
    try:
        from src.services.auto_process_service import initialize_file_monitor
        initialize_file_monitor()
        app.logger.info("文件监控服务已启动")
    except Exception as e:
        app.logger.error(f"启动文件监控服务失败: {e}")


def _migrate_database(app):
    """
    执行数据库表结构迁移

    检查并添加缺失的字段，确保数据库结构与代码一致。
    """
    from src.clients import db
    from src.models import SystemSetting

    try:
        db.create_all()
    except Exception as e:
        app.logger.warning(f"数据库表结构自动创建检查失败: {e}")

    # 动态设置最大上传文件大小
    max_file_size_mb = SystemSetting.get_setting('max_file_size_mb', 250)
    app.config['MAX_CONTENT_LENGTH'] = max_file_size_mb * 1024 * 1024
    app.logger.info(f"最大上传文件大小已设置为 {max_file_size_mb}MB")

    # 检查 draft_recording 表结构
    try:
        app.logger.info("检查 draft_recording 表结构...")

        with db.engine.connect() as conn:
            result = conn.execute(text("PRAGMA table_info(draft_recording)"))
            columns = [row[1] for row in result]

            if 'combined_transcription' not in columns:
                app.logger.info("添加 combined_transcription 字段...")
                conn.execute(text("ALTER TABLE draft_recording ADD COLUMN combined_transcription TEXT"))
                conn.commit()
                app.logger.info("字段添加成功")

    except Exception as e:
        app.logger.warning(f"表结构迁移检查失败: {e}")