from fastapi import APIRouter, HTTPException, Query
from pydantic import BaseModel
from app.core.embedding import embedder
from app.core.config import settings
from llama_index.vector_stores.faiss import FaissVectorStore
from llama_index import VectorStoreIndex, ServiceContext
import os
import logging
import faiss  # 引入faiss

router = APIRouter()

# 设置日志记录器
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class QueryRequest(BaseModel):
    query: str

@router.post("/search")
def search_docs(request: QueryRequest, user_id: str = Query(..., description="用户ID")):
    try:
        logger.info(f"Received search request from user: {user_id} with query: {request.query}")

        # 修正后的索引路径，确保指向整个目录，而不是单个文件
        index_path = os.path.join("index_data", user_id)  # 使用整个目录路径
        logger.info(f"Looking for index at path: {index_path}")

        # 检查索引目录是否存在
        if not os.path.exists(index_path):
            logger.error(f"Index not found for user: {user_id} at {index_path}")
            raise HTTPException(status_code=404, detail="用户索引不存在")

        # 加载 Faiss 索引
        faiss_index_file = os.path.join(index_path, "index.faiss")  # 指定faiss索引文件路径
        if not os.path.exists(faiss_index_file):
            logger.error(f"Faiss index not found at {faiss_index_file}")
            raise HTTPException(status_code=404, detail="Faiss索引文件未找到")

        faiss_index = faiss.read_index(faiss_index_file)  # 使用faiss加载索引文件
        logger.info("Faiss index loaded successfully.")

        # 创建 FaissVectorStore 实例
        vector_store = FaissVectorStore(faiss_index=faiss_index)
        logger.info("FaissVectorStore created successfully.")

        # 创建 ServiceContext 实例
        service_context = ServiceContext.from_defaults(embed_model=embedder, llm=None)
        logger.info("Service context created successfully.")

        # 创建 VectorStoreIndex
        index = VectorStoreIndex.from_vector_store(vector_store, service_context=service_context)
        logger.info("VectorStoreIndex created successfully.")

        # 检索结果（真实文本）
        retriever = index.as_retriever(similarity_top_k=settings.TOP_K)
        logger.info(f"Retrieving top {settings.TOP_K} results for query: {request.query}")
        nodes = retriever.retrieve(request.query)

        # 返回检索结果
        result = {
            "user_id": user_id,
            "query": request.query,
            "results": [
                {"score": float(node.score or 0), "text": node.get_content()}
                for node in nodes
            ]
        }

        logger.info(f"Search results for user {user_id}: {result}")
        return result

    except Exception as e:
        logger.error(f"Error processing search request: {e}", exc_info=True)
        raise HTTPException(status_code=500, detail=str(e))
