"""
Object Detection API Routes
"""
from fastapi import APIRouter, HTTPException, UploadFile, File, Query
from typing import List, Optional

from app.services.detection_service import detection_service

router = APIRouter()


@router.post("/detect", summary="Detect objects in image")
async def detect_objects(
    file: UploadFile = File(...),
    confidence: float = Query(0.5, ge=0.1, le=1.0, description="Minimum confidence threshold"),
    classes: Optional[str] = Query(None, description="Comma-separated class names to detect")
):
    """
    Detect objects in an uploaded image
    """
    if not file.content_type.startswith("image/"):
        raise HTTPException(status_code=400, detail="File must be an image")

    contents = await file.read()
    class_list = [c.strip() for c in classes.split(",")] if classes else None

    result = await detection_service.detect_objects(contents, confidence, class_list)

    return {
        "filename": file.filename,
        **result
    }


@router.post("/count", summary="Count specific objects")
async def count_objects(
    file: UploadFile = File(...),
    target_class: str = Query(..., description="Class to count (e.g., 'person', 'car')"),
    confidence: float = Query(0.5, ge=0.1, le=1.0)
):
    """
    Count specific objects in an image
    """
    if not file.content_type.startswith("image/"):
        raise HTTPException(status_code=400, detail="File must be an image")

    contents = await file.read()
    result = await detection_service.detect_and_count(contents, target_class, confidence)

    return {
        "filename": file.filename,
        **result
    }


@router.post("/annotate", summary="Detect and annotate image")
async def detect_and_annotate(
    file: UploadFile = File(...),
    confidence: float = Query(0.5, ge=0.1, le=1.0)
):
    """
    Detect objects and return annotated image
    """
    if not file.content_type.startswith("image/"):
        raise HTTPException(status_code=400, detail="File must be an image")

    contents = await file.read()
    result = await detection_service.detect_with_annotations(contents, confidence)

    return {
        "filename": file.filename,
        **result
    }


@router.get("/classes", summary="Get available detection classes")
async def get_classes():
    """
    Get list of classes the model can detect
    """
    classes = detection_service.get_available_classes()
    return {
        "total_classes": len(classes),
        "classes": classes
    }


@router.post("/batch", summary="Batch object detection")
async def batch_detect(
    files: List[UploadFile] = File(...),
    confidence: float = Query(0.5, ge=0.1, le=1.0)
):
    """
    Detect objects in multiple images
    """
    if len(files) > 10:
        raise HTTPException(status_code=400, detail="Maximum 10 files per batch")

    results = []

    for file in files:
        if not file.content_type.startswith("image/"):
            results.append({
                "filename": file.filename,
                "error": "Not an image file"
            })
            continue

        contents = await file.read()
        result = await detection_service.detect_objects(contents, confidence)
        results.append({
            "filename": file.filename,
            **result
        })

    return {
        "total_files": len(files),
        "results": results
    }
