"""
RAG 系统命令行界面 (CLI)
提供索引构建、查询、管理等功能
"""
import sys
import argparse

from src.config import get_config_manager
from src.cli import (
    cmd_index,
    cmd_query,
    cmd_retrieve,
    cmd_status,
    cmd_delete,
    cmd_config,
)


# 获取配置实例
config = get_config_manager()


def main():
    """主函数 - CLI 入口点"""
    # 创建主解析器
    parser = argparse.ArgumentParser(
        description="RAG 知识库系统 - 基于 LlamaIndex 的命令行工具",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
使用示例:
  # 构建索引
  python cli.py index --dir ./my_knowledge_base
  
  # 强制重建索引
  python cli.py index --dir ./my_knowledge_base --force
  
  # 单次查询（使用默认混合检索）
  python cli.py query --question "什么是 RAG?"
  
  # 使用纯向量检索
  python cli.py query --question "什么是 RAG?" --mode vector
  
  # 使用纯BM25检索
  python cli.py query --question "什么是 RAG?" --mode bm25
  
  # 使用混合检索
  python cli.py query --question "什么是 RAG?" --mode hybrid
  
  # 交互式查询
  python cli.py query --interactive
  
  # 查询并显示源文档
  python cli.py query --question "什么是 RAG?" --sources
  
  # 查看系统状态
  python cli.py status
  
  # 查看详细状态
  python cli.py status --verbose --config
  
  # 删除索引
  python cli.py delete
  
  # 查看配置
  python cli.py config

更多信息请参考 README.md
        """
    )
    
    # 创建子命令解析器
    subparsers = parser.add_subparsers(title="可用命令", dest="command", help="命令帮助")
    
    # ========== index 命令 ==========
    parser_index = subparsers.add_parser(
        "index",
        help="构建知识库索引",
        description="从指定目录读取文档并构建向量索引"
    )
    parser_index.add_argument(
        "--dir",
        type=str,
        help=f"文档目录路径 (默认: {config.paths.knowledge_dir})"
    )
    parser_index.add_argument(
        "--force",
        action="store_true",
        help="强制重建索引（即使已存在）"
    )
    parser_index.set_defaults(func=cmd_index)
    
    # ========== query 命令 ==========
    parser_query = subparsers.add_parser(
        "query",
        help="查询知识库",
        description="基于已构建的索引进行问答查询"
    )
    parser_query.add_argument(
        "--question",
        "-q",
        type=str,
        help="要查询的问题"
    )
    parser_query.add_argument(
        "--interactive",
        "-i",
        action="store_true",
        help="进入交互式查询模式"
    )
    parser_query.add_argument(
        "--mode",
        "-m",
        type=str,
        choices=["vector", "bm25", "hybrid"],
        default=None,
        help=f"检索模式: vector(纯向量), bm25(纯BM25), hybrid(混合) (默认: {config.retrieval.mode})"
    )
    parser_query.add_argument(
        "--top-k",
        type=int,
        default=config.retrieval.top_k,
        help=f"检索的相关文档数量 (默认: {config.retrieval.top_k})"
    )
    parser_query.add_argument(
        "--sources",
        "-s",
        action="store_true",
        help="显示相关的源文档片段"
    )
    parser_query.set_defaults(func=cmd_query)
    
    # ========== retrieve 命令 ==========
    parser_retrieve = subparsers.add_parser(
        "retrieve",
        help="检索文档片段（不使用LLM）",
        description="仅检索相关文档片段，不生成答案"
    )
    parser_retrieve.add_argument(
        "--question",
        "-q",
        type=str,
        help="要检索的内容"
    )
    parser_retrieve.add_argument(
        "--interactive",
        "-i",
        action="store_true",
        help="进入交互式检索模式"
    )
    parser_retrieve.add_argument(
        "--mode",
        "-m",
        type=str,
        choices=["vector", "bm25", "hybrid"],
        default=None,
        help=f"检索模式: vector(纯向量), bm25(纯BM25), hybrid(混合) (默认: {config.retrieval.mode})"
    )
    parser_retrieve.add_argument(
        "--top-k",
        type=int,
        default=config.retrieval.top_k,
        help=f"检索的相关文档数量 (默认: {config.retrieval.top_k})"
    )
    parser_retrieve.set_defaults(func=cmd_retrieve)
    
    # ========== status 命令 ==========
    parser_status = subparsers.add_parser(
        "status",
        help="查看系统状态",
        description="显示索引状态和系统配置信息"
    )
    parser_status.add_argument(
        "--verbose",
        "-v",
        action="store_true",
        help="显示详细信息"
    )
    parser_status.add_argument(
        "--config",
        "-c",
        action="store_true",
        help="显示系统配置"
    )
    parser_status.set_defaults(func=cmd_status)
    
    # ========== delete 命令 ==========
    parser_delete = subparsers.add_parser(
        "delete",
        help="删除索引",
        description="删除已构建的索引文件"
    )
    parser_delete.add_argument(
        "--yes",
        "-y",
        action="store_true",
        help="跳过确认提示"
    )
    parser_delete.set_defaults(func=cmd_delete)
    
    # ========== config 命令 ==========
    parser_config = subparsers.add_parser(
        "config",
        help="查看系统配置",
        description="显示当前系统配置信息"
    )
    parser_config.set_defaults(func=cmd_config)
    
    # 解析参数
    args = parser.parse_args()
    
    # 如果没有指定命令，显示帮助信息
    if not args.command:
        parser.print_help()
        sys.exit(0)
    
    # 执行对应的命令处理器
    try:
        args.func(args)
    except KeyboardInterrupt:
        print("\n\n👋 操作已取消")
        sys.exit(0)
    except Exception as e:
        print(f"\n❌ 发生错误: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)


if __name__ == "__main__":
    main()
