# app/modules/cms/routes/api/admin_images.py
"""
Admin image management endpoints.

Provides:
- Image upload with automatic processing
- Image deletion
- Storage statistics
"""

import logging

from fastapi import APIRouter, Depends, File, Form, UploadFile

from app.api.deps import get_current_admin_api
from app.modules.core.services.image_service import image_service
from models.schema.auth import UserContext
from app.modules.cms.schemas.image import (
    ImageDeleteResponse,
    ImageStorageStats,
    ImageUploadResponse,
)

admin_images_router = APIRouter(prefix="/images")
logger = logging.getLogger(__name__)


@admin_images_router.post("/upload", response_model=ImageUploadResponse)
async def upload_image(
    file: UploadFile = File(...),
    vendor_id: int = Form(...),
    product_id: int | None = Form(None),
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """Upload and process an image.

    The image will be:
    - Converted to WebP format
    - Resized to multiple variants (original, 800px, 200px)
    - Stored in a sharded directory structure

    Args:
        file: Image file to upload
        vendor_id: Vendor ID for the image
        product_id: Optional product ID

    Returns:
        Image URLs and metadata
    """
    # Read file content
    content = await file.read()

    # Delegate all validation and processing to service
    result = image_service.upload_product_image(
        file_content=content,
        filename=file.filename or "image.jpg",
        content_type=file.content_type,
        vendor_id=vendor_id,
        product_id=product_id,
    )

    logger.info(f"Image uploaded: {result['id']} for vendor {vendor_id}")

    return ImageUploadResponse(success=True, image=result)


@admin_images_router.delete("/{image_hash}", response_model=ImageDeleteResponse)
async def delete_image(
    image_hash: str,
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """Delete an image and all its variants.

    Args:
        image_hash: The image ID/hash

    Returns:
        Deletion status
    """
    deleted = image_service.delete_product_image(image_hash)

    if deleted:
        logger.info(f"Image deleted: {image_hash}")
        return ImageDeleteResponse(success=True, message="Image deleted successfully")
    else:
        return ImageDeleteResponse(success=False, message="Image not found")


@admin_images_router.get("/stats", response_model=ImageStorageStats)
async def get_storage_stats(
    current_admin: UserContext = Depends(get_current_admin_api),
):
    """Get image storage statistics.

    Returns:
        Storage metrics including file counts, sizes, and directory info
    """
    stats = image_service.get_storage_stats()
    return ImageStorageStats(**stats)
