from fastapi import APIRouter, HTTPException, Depends, Request
from model.category import CategoryPayload, CategoryDatabaseModel
from MongoDBConnection import MONGO_URI, DB_NAME
from utils.auth_helper import requires_permission, assert_actor_match
from utils.turnstile_helper import verify_turnstile

router = APIRouter()

class CategoryAdminPayload(CategoryPayload):
    actorId: str


db_model = CategoryDatabaseModel(
    db_uri=MONGO_URI,
    db_name=DB_NAME,
    collection_name="categories"
)


@router.post("/categories", dependencies=[Depends(verify_turnstile)])
async def add_category(
    category: CategoryAdminPayload,
    current_user=Depends(requires_permission("product_management"))
):
    try:
        actor_id = current_user["id"]
        actor_name = current_user.get("name", "")
        assert_actor_match(current_user, category.actorId)

        raw_data = category.model_dump(exclude={"actorId"})
        inserted_id = db_model.insert_category(raw_data)

        return {
            "status": "success",
            "message": "Đã thêm danh mục thành công!",
            "data": {"id": inserted_id},
            "actedBy": {
                "id": actor_id,
                "name": actor_name
            }
        }
    except ValueError as ve:
        raise HTTPException(status_code=400, detail=str(ve))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


# Giữ route /api/admin/categories để khớp với FE hiện tại của trang Add Product.
# GET danh mục chỉ là dữ liệu catalog, nên cho phép đọc công khai để component fetch trực tiếp vẫn chạy.
@router.get("/categories")
async def list_categories():
    try:
        categories = db_model.get_all_categories()
        return {
            "status": "success",
            "data": categories
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.put("/categories/{category_id}", dependencies=[Depends(verify_turnstile)])
async def update_category(
    category_id: str,
    category: CategoryAdminPayload,
    current_user=Depends(requires_permission("product_management"))
):
    try:
        actor_id = current_user["id"]
        actor_name = current_user.get("name", "")
        assert_actor_match(current_user, category.actorId)

        raw_data = category.model_dump(exclude={"actorId"})
        updated_count = db_model.update_category(category_id, raw_data)

        if updated_count == 0:
            raise HTTPException(status_code=404, detail="Không tìm thấy danh mục để cập nhật")

        return {
            "status": "success",
            "message": "Cập nhật danh mục thành công!",
            "actedBy": {
                "id": actor_id,
                "name": actor_name
            }
        }
    except ValueError as ve:
        raise HTTPException(status_code=400, detail=str(ve))
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))


@router.delete("/categories/{category_id}", dependencies=[Depends(verify_turnstile)])
async def delete_category(
    category_id: str,
    request: Request,
    current_user=Depends(requires_permission("product_management"))
):
    try:
        actor_id = current_user["id"]
        actor_name = current_user.get("name", "")
        assert_actor_match(current_user, request.headers.get("x-actor-id"))

        deleted_count = db_model.delete_category(category_id)

        if deleted_count == 0:
            raise HTTPException(status_code=404, detail="Không tìm thấy danh mục để xóa")

        return {
            "status": "success",
            "message": "Đã xóa danh mục thành công!",
            "actedBy": {
                "id": actor_id,
                "name": actor_name
            }
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))