# app/api/v1/vendor/customers.py """ Vendor customer management endpoints. Vendor Context: Uses token_vendor_id from JWT token (authenticated vendor API pattern). The get_current_vendor_api dependency guarantees token_vendor_id is present. """ 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.vendor_service import vendor_service from models.database.user import User from models.schema.customer import ( CustomerDetailResponse, CustomerMessageResponse, CustomerOrdersResponse, CustomerStatisticsResponse, CustomerUpdate, VendorCustomerListResponse, ) router = APIRouter(prefix="/customers") logger = logging.getLogger(__name__) @router.get("", response_model=VendorCustomerListResponse) def get_vendor_customers( skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=1000), search: str | None = Query(None), is_active: bool | None = Query(None), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get all customers for this vendor. TODO: Implement in Slice 4 - Query customers filtered by vendor_id - Support search by name/email - Support filtering by active status - Return paginated results """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return VendorCustomerListResponse( customers=[], total=0, skip=skip, limit=limit, message="Customer management coming in Slice 4", ) @router.get("/{customer_id}", response_model=CustomerDetailResponse) def get_customer_details( customer_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get detailed customer information. TODO: Implement in Slice 4 - Get customer by ID - Verify customer belongs to vendor - Include order history - Include total spent, etc. """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return CustomerDetailResponse(message="Customer details coming in Slice 4") @router.get("/{customer_id}/orders", response_model=CustomerOrdersResponse) def get_customer_orders( customer_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get order history for a specific customer. TODO: Implement in Slice 5 - Get all orders for customer - Filter by vendor_id - Return order details """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return CustomerOrdersResponse( orders=[], message="Customer orders coming in Slice 5" ) @router.put("/{customer_id}", response_model=CustomerMessageResponse) def update_customer( customer_id: int, customer_data: CustomerUpdate, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Update customer information. TODO: Implement in Slice 4 - Update customer details - Verify customer belongs to vendor - Update customer preferences """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return CustomerMessageResponse(message="Customer update coming in Slice 4") @router.put("/{customer_id}/status", response_model=CustomerMessageResponse) def toggle_customer_status( customer_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Activate/deactivate customer account. TODO: Implement in Slice 4 - Toggle customer is_active status - Verify customer belongs to vendor - Log the change """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return CustomerMessageResponse(message="Customer status toggle coming in Slice 4") @router.get("/{customer_id}/stats", response_model=CustomerStatisticsResponse) def get_customer_statistics( customer_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get customer statistics and metrics. TODO: Implement in Slice 4 - Total orders - Total spent - Average order value - Last order date """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return CustomerStatisticsResponse( total_orders=0, total_spent=0.0, average_order_value=0.0, last_order_date=None, message="Customer statistics coming in Slice 4", )