from fastapi import FastAPI, HTTPException,Depends, APIRouter, status
from typing import List
import json
from src.utils.db import get_db
from sqlalchemy.orm import Session
from .schema import  SearchRequest, SearchResponse
from .service import QdrantService
from fastapi import Query
from fastapi.responses import JSONResponse
import json
from .controller import insert_documents_handler,search_handler,list_collections_handler,collection_info_handler,delete_collection_handler,count_points_handler,health_handler
vector_db_router = APIRouter()



    
@vector_db_router.post("/documents/bulk-insert", 
                      status_code=status.HTTP_201_CREATED,
                      summary="Bulk insert templates into vector database",
                      description="Processes all unprocessed templates from the database and inserts them into Qdrant collections")
def bulk_insert(db: Session = Depends(get_db)):
    result = insert_documents_handler(db=db)
    return {
        **result,
        "detail": "Templates processed and inserted into vector database"
    }




# @vector_db_router.post("/search", 
#                       response_model=SearchResponse,
#                       status_code=status.HTTP_200_OK)
# def search(request: SearchRequest):
#     return search_handler(request)
#--------------------------------Vector search ----------------------------------------------------------------------------------
@vector_db_router.post("/search")
def search(request: SearchRequest,
            page: int = Query(1, description="Page number (starts from 1)", ge=1),
            page_size: int = Query(10, description="Number of records per page", ge=1, le=100)
            ):
    result = search_handler(request)  # this returns a SearchResponse object

    # Access results using dot notation
    total = len(result.results)
    start = (page - 1) * page_size
    end = start + page_size

    paginated_results = result.results[start:end]

    data = []
    for item in paginated_results:
        data.append({
            "template_id": int(item.template_id),  # Convert from string if needed
            "template_name": item.template_name,
            "template_url": item.template_url,
            "template_metadata": (
                item.template_metadata
                if isinstance(item.template_metadata, str)
                else json.dumps(item.template_metadata)
            )
        })

    return JSONResponse(content={
        "status": True,
        "page": page,
        "page_size": page_size,
        "total": total,
        "data": data
    })


#-------------------------------------End ---------------------------------------------------------------------------

@vector_db_router.get("/collections")
def list_collections():
    return list_collections_handler()




@vector_db_router.get("/collections/{name}/info")
def collection_info(name: str):
    return collection_info_handler(name)

@vector_db_router.delete("/collections/{name}")
def delete_collection(name: str):
    return delete_collection_handler(name)

@vector_db_router.get("/collections/{name}/count")
def count(name: str):
    return count_points_handler(name)

@vector_db_router.get("/health")
def health():
    return health_handler()




