#!/usr/bin/env python3
"""
诊断文档列表功能问题
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from src.core.index_manager import IndexManager
from src.core.index_loader import IndexLoader
from src.config import get_config_manager

def diagnose_document_list():
    """诊断文档列表功能"""
    print("=" * 60)
    print("诊断文档列表功能")
    print("=" * 60)
    
    # 获取配置
    config = get_config_manager()
    
    # 加载索引
    print("\n1. 加载索引...")
    index_loader = IndexLoader(config)
    index_result = index_loader.load_vector_index()
    
    if not index_result.success:
        print(f"❌ 索引加载失败: {index_result.message}")
        return False
    
    index = index_result.index
    if index is None:
        print("❌ 索引为None")
        return False
    
    print("✅ 索引加载成功")
    
    # 检查索引的存储上下文
    print("\n2. 检查索引存储上下文...")
    storage_context = index.storage_context
    print(f"存储上下文类型: {type(storage_context)}")
    
    # 检查文档存储
    doc_store = storage_context.docstore
    print(f"文档存储类型: {type(doc_store)}")
    
    # 检查文档存储的方法
    print(f"文档存储方法: {dir(doc_store)[:10]}...")
    
    # 尝试不同的访问方式
    print("\n3. 尝试不同的文档访问方式...")
    
    # 方式1: 使用docs属性
    try:
        all_docs = doc_store.docs
        print(f"方式1 - doc_store.docs: {type(all_docs)}, 长度: {len(all_docs)}")
        if all_docs:
            for doc_id, doc in list(all_docs.items())[:3]:
                print(f"  - {doc_id}: {type(doc)}, 文本长度: {len(doc.text) if hasattr(doc, 'text') else 'N/A'}")
    except Exception as e:
        print(f"方式1失败: {e}")
    
    # 方式2: 使用get_all_documents方法
    try:
        if hasattr(doc_store, 'get_all_documents'):
            all_docs = doc_store.get_all_documents()
            print(f"方式2 - get_all_documents(): {type(all_docs)}, 长度: {len(all_docs) if hasattr(all_docs, '__len__') else 'N/A'}")
    except Exception as e:
        print(f"方式2失败: {e}")
    
    # 方式3: 使用get_document方法测试已知ID
    try:
        # 从存储文件中获取已知的文档ID
        import json
        vector_storage_dir = config.paths.vector_storage_dir
        if vector_storage_dir is not None:
            docstore_path = vector_storage_dir / "docstore.json"
            if docstore_path.exists():
                with open(docstore_path, 'r', encoding='utf-8') as f:
                    docstore_data = json.load(f)
                
                if "docstore/ref_doc_info" in docstore_data:
                    ref_docs = docstore_data["docstore/ref_doc_info"]
                    known_doc_id = list(ref_docs.keys())[0] if ref_docs else None
                    
                    if known_doc_id:
                        doc = doc_store.get_document(known_doc_id)
                        print(f"方式3 - get_document('{known_doc_id}'): {'成功' if doc else '失败'}")
                        if doc:
                            print(f"    文本长度: {len(doc.text) if hasattr(doc, 'text') else 'N/A'}")
    except Exception as e:
        print(f"方式3失败: {e}")
    
    # 方式4: 检查文档存储的内部结构
    print("\n4. 检查文档存储内部结构...")
    try:
        # 尝试访问内部属性
        if hasattr(doc_store, '_docstore'):
            print(f"有_docstore属性: {type(doc_store._docstore)}")
        if hasattr(doc_store, '_data'):
            print(f"有_data属性: {type(doc_store._data)}")
        if hasattr(doc_store, '__dict__'):
            print(f"属性: {list(doc_store.__dict__.keys())}")
    except Exception as e:
        print(f"检查内部结构失败: {e}")
    
    return True

def fix_document_list():
    """修复文档列表功能"""
    print("\n" + "=" * 60)
    print("修复文档列表功能")
    print("=" * 60)
    
    # 查看index_manager.list_all_documents的实现
    print("查看index_manager.list_all_documents的实现...")
    
    # 读取源代码
    import inspect
    from src.core.index_manager import IndexManager
    
    source = inspect.getsource(IndexManager.list_all_documents)
    print("方法实现:")
    print(source[:500] + "..." if len(source) > 500 else source)
    
    # 问题分析
    print("\n问题分析:")
    print("1. doc_store.docs 可能返回空字典")
    print("2. 可能需要使用不同的方法访问文档")
    print("3. 文档存储可能没有正确加载")
    
    return True

if __name__ == "__main__":
    print("开始诊断文档列表功能...")
    
    # 诊断问题
    diagnose_success = diagnose_document_list()
    
    # 分析修复方案
    fix_success = fix_document_list()
    
    print("\n" + "=" * 60)
    print("诊断完成")
    print("=" * 60)