"""
公共验证工具模块
提取重复的验证逻辑到统一的工具函数
"""
from typing import Optional
from loguru import logger


def check_bm25_available(use_bm25: bool, bm25_retriever) -> bool:
    """
    检查BM25检索器是否可用
    
    Args:
        use_bm25: 是否启用BM25配置
        bm25_retriever: BM25检索器实例
        
    Returns:
        bool: BM25是否可用
    """
    return use_bm25 and bm25_retriever is not None


def validate_bm25_retriever(use_bm25: bool, bm25_retriever, raise_error: bool = True) -> bool:
    """
    验证BM25检索器是否可用，可选择抛出异常或返回布尔值
    
    Args:
        use_bm25: 是否启用BM25配置
        bm25_retriever: BM25检索器实例
        raise_error: 如果检索器不可用是否抛出异常
        
    Returns:
        bool: BM25是否可用
        
    Raises:
        ValueError: 当 raise_error=True 且BM25不可用时
    """
    is_available = check_bm25_available(use_bm25, bm25_retriever)
    
    if not is_available:
        if raise_error:
            raise ValueError("BM25检索器未启用或未加载")
        else:
            logger.warning("BM25检索器未启用，回退到纯向量检索")
    
    return is_available


def apply_nest_asyncio():
    """
    应用nest_asyncio以支持异步操作
    处理重复应用的情况
    """
    try:
        import nest_asyncio
        nest_asyncio.apply()
        logger.debug("nest_asyncio 已应用")
    except RuntimeError:
        logger.debug("nest_asyncio 已应用或事件循环已在运行")
    except Exception as e:
        logger.warning(f"应用 nest_asyncio 失败: {e}")
