# app/api/v1/vendor/media.py """ Vendor media and file 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, File, Query, UploadFile 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.media import ( MediaDetailResponse, MediaListResponse, MediaMetadataUpdate, MediaUploadResponse, MediaUsageResponse, MultipleUploadResponse, OptimizationResultResponse, ) router = APIRouter(prefix="/media") logger = logging.getLogger(__name__) @router.get("", response_model=MediaListResponse) def get_media_library( skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=1000), media_type: str | None = Query(None, description="image, video, document"), search: str | None = Query(None), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get vendor media library. TODO: Implement in Slice 3 - Get all media files for vendor - Filter by type (image, video, document) - Search by filename - Support pagination - Return file URLs, sizes, metadata """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MediaListResponse( media=[], total=0, skip=skip, limit=limit, message="Media library coming in Slice 3", ) @router.post("/upload", response_model=MediaUploadResponse) async def upload_media( file: UploadFile = File(...), folder: str | None = Query(None, description="products, general, etc."), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Upload media file. TODO: Implement in Slice 3 - Accept file upload - Validate file type and size - Store file (local or cloud storage) - Generate thumbnails for images - Save metadata to database - Return file URL """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MediaUploadResponse( file_url=None, thumbnail_url=None, message="Media upload coming in Slice 3", ) @router.post("/upload/multiple", response_model=MultipleUploadResponse) async def upload_multiple_media( files: list[UploadFile] = File(...), folder: str | None = Query(None), current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Upload multiple media files at once. TODO: Implement in Slice 3 - Accept multiple files - Process each file - Return list of uploaded file URLs - Handle errors gracefully """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MultipleUploadResponse( uploaded_files=[], failed_files=[], message="Multiple upload coming in Slice 3", ) @router.get("/{media_id}", response_model=MediaDetailResponse) def get_media_details( media_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get media file details. TODO: Implement in Slice 3 - Get file metadata - Return file URL - Return usage information (which products use this file) """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MediaDetailResponse(message="Media details coming in Slice 3") @router.put("/{media_id}", response_model=MediaDetailResponse) def update_media_metadata( media_id: int, metadata: MediaMetadataUpdate, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Update media file metadata. TODO: Implement in Slice 3 - Update filename - Update alt text - Update tags/categories - Update description """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MediaDetailResponse(message="Media update coming in Slice 3") @router.delete("/{media_id}", response_model=MediaDetailResponse) def delete_media( media_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Delete media file. TODO: Implement in Slice 3 - Verify file belongs to vendor - Check if file is in use by products - Delete file from storage - Delete database record - Return success/error """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MediaDetailResponse(message="Media deletion coming in Slice 3") @router.get("/{media_id}/usage", response_model=MediaUsageResponse) def get_media_usage( media_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Get where this media file is being used. TODO: Implement in Slice 3 - Check products using this media - Check other entities using this media - Return list of usage """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return MediaUsageResponse( products=[], other_usage=[], message="Media usage tracking coming in Slice 3", ) @router.post("/optimize/{media_id}", response_model=OptimizationResultResponse) def optimize_media( media_id: int, current_user: User = Depends(get_current_vendor_api), db: Session = Depends(get_db), ): """ Optimize media file (compress, resize, etc.). TODO: Implement in Slice 3 - Optimize image (compress, resize) - Generate multiple sizes - Keep original - Update database with new versions """ vendor = vendor_service.get_vendor_by_id(db, current_user.token_vendor_id) # noqa: F841 return OptimizationResultResponse(message="Media optimization coming in Slice 3")