"""Product routes: search/list, detail, price history.""" from uuid import UUID from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy.ext.asyncio import AsyncSession from cartsnitch_api.auth.dependencies import get_current_user from cartsnitch_api.database import get_db from cartsnitch_api.schemas import PriceTrendResponse, ProductDetailResponse, ProductResponse from cartsnitch_api.services.products import ProductService router = APIRouter(prefix="/products", tags=["products"]) @router.get("", response_model=list[ProductResponse]) async def list_products( user_id: str = Depends(get_current_user), q: str | None = Query(None), category: str | None = Query(None), page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), db: AsyncSession = Depends(get_db), ): svc = ProductService(db) return await svc.list_products(q, category, page, page_size) @router.get("/{product_id}", response_model=ProductDetailResponse) async def get_product( product_id: UUID, user_id: str = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): svc = ProductService(db) try: return await svc.get_product(product_id) except LookupError: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Product not found" ) from None @router.get("/{product_id}/prices", response_model=PriceTrendResponse) async def get_product_prices( product_id: UUID, user_id: str = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): svc = ProductService(db) try: return await svc.get_price_history(product_id) except LookupError: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Product not found" ) from None