from fastapi import APIRouter, HTTPException
from ..Indexdocuments.product_index_service import (
    index_products,
    add_product,
    delete_product,
)
from ..faqgenerator.agent import index_QA_doc
from pydantic import BaseModel
from .schema import FAQIndexRequest
from typing import Any, Dict


router = APIRouter(prefix="/products", tags=["Products"])


class StoreRequest(BaseModel):
    store_id: str


@router.post("/index")
async def index_products_endpoint(request: StoreRequest):
    """
    Index all products for a given store into Qdrant.
    """
    try:
        count = index_products(request.store_id)
        return {"status": "ok", "indexed": count}
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")


class AddProductRequest(BaseModel):
    store_id: str
    product: Any


@router.post("/index/add")
async def add_product_endpoint(request: AddProductRequest):
    """
    Add a single product (from webhook payload) to Qdrant.
    Mirrors /index but for one product.
    """
    try:
        print("request for add shopify product", request)
        success = add_product(request.product, request.store_id)

        if not success:
            raise HTTPException(
                status_code=400,
                detail="Failed to add product to index",
            )

        return {"status": "ok", "message": "Product added successfully"}

    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")


class DeleteProductRequest(BaseModel):
    store_id: str
    product_id: int


@router.post("/index/delete")
async def delete_product_endpoint(request: DeleteProductRequest):
    """
    Delete a single product from Qdrant.
    Mirrors /index/add but for removal.
    """
    try:
        success = delete_product(request.product_id, request.store_id)

        if not success:
            raise HTTPException(
                status_code=400,
                detail="Failed to delete product from index",
            )

        return {"status": "ok", "message": "Product deleted successfully"}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")


@router.post("/index/FAQ")
async def index_faq_endpoint(request: FAQIndexRequest):
    """
    Index QA pairs for a given document into Qdrant.
    """
    try:
        success = index_QA_doc(request.agent_id)
        if not success:
            raise ValueError(
                f"No QA pairs could be generated for document {request.agent_id}"
            )
        return {"status": "ok", "document_id": request.agent_id}
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")
