# app/api/v1/vendor/inventory.py import logging from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.api.deps import get_current_vendor_api from app.core.database import get_db from app.services.inventory_service import inventory_service from middleware.vendor_context import require_vendor_context from models.database.user import User from models.database.vendor import Vendor from models.schema.inventory import ( InventoryAdjust, InventoryCreate, InventoryListResponse, InventoryReserve, InventoryResponse, InventoryUpdate, ProductInventorySummary, ) router = APIRouter() logger = logging.getLogger(__name__) @router.post("/inventory/set", response_model=InventoryResponse) def set_inventory( inventory: InventoryCreate, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Set exact inventory quantity (replaces existing).""" return inventory_service.set_inventory(db, vendor.id, inventory) @router.post("/inventory/adjust", response_model=InventoryResponse) def adjust_inventory( adjustment: InventoryAdjust, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Adjust inventory (positive to add, negative to remove).""" return inventory_service.adjust_inventory(db, vendor.id, adjustment) @router.post("/inventory/reserve", response_model=InventoryResponse) def reserve_inventory( reservation: InventoryReserve, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Reserve inventory for an order.""" return inventory_service.reserve_inventory(db, vendor.id, reservation) @router.post("/inventory/release", response_model=InventoryResponse) def release_reservation( reservation: InventoryReserve, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Release reserved inventory (cancel order).""" return inventory_service.release_reservation(db, vendor.id, reservation) @router.post("/inventory/fulfill", response_model=InventoryResponse) def fulfill_reservation( reservation: InventoryReserve, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Fulfill reservation (complete order, remove from stock).""" return inventory_service.fulfill_reservation(db, vendor.id, reservation) @router.get("/inventory/product/{product_id}", response_model=ProductInventorySummary) def get_product_inventory( product_id: int, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Get inventory summary for a product.""" return inventory_service.get_product_inventory(db, vendor.id, product_id) @router.get("/inventory", response_model=InventoryListResponse) def get_vendor_inventory( skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=1000), location: str | None = Query(None), low_stock: int | None = Query(None, ge=0), vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Get all inventory for vendor.""" inventories = inventory_service.get_vendor_inventory( db, vendor.id, skip, limit, location, low_stock ) # Get total count total = len(inventories) # You might want a separate count query for large datasets return InventoryListResponse( inventories=inventories, total=total, skip=skip, limit=limit ) @router.put("/inventory/{inventory_id}", response_model=InventoryResponse) def update_inventory( inventory_id: int, inventory_update: InventoryUpdate, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Update inventory entry.""" return inventory_service.update_inventory( db, vendor.id, inventory_id, inventory_update ) @router.delete("/inventory/{inventory_id}") def delete_inventory( inventory_id: int, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """Delete inventory entry.""" inventory_service.delete_inventory(db, vendor.id, inventory_id) return {"message": "Inventory deleted successfully"}