
import time

from fastapi import APIRouter
from fastapi import File
from fastapi import Request
from fastapi import UploadFile

from config.logger import logger

from services.image_service import ImageService
from services.detector_service import DetectorService

from utils.response import success_response
from utils.serializer import Serializer


router = APIRouter()


# ==================================================
# Detect Face
# ==================================================

@router.post(
    "/detect",
    summary="Detect Face(s)",
    description="Detect one or more faces from an uploaded image."
)
async def detect_face(

    request: Request,

    image: UploadFile = File(...)

):

    # ==========================================
    # Request Information
    # ==========================================

    request_id = request.state.request_id

    logger.info(

        "[%s] Face detection request received.",

        request_id

    )

    # ==========================================
    # Read Image
    # ==========================================

    image_data = await ImageService.read(image)

    # ==========================================
    # Detect Faces
    # ==========================================

    faces = DetectorService.detect(image_data)

    # ==========================================
    # Processing Time
    # ==========================================

    processing_time = round(

        (
            time.perf_counter()
            -
            request.state.start_time
        ) * 1000,

        2

    )

    logger.info(

        "[%s] Detection completed. %d face(s) found.",

        request_id,

        len(faces)

    )

    # ==========================================
    # Success Response
    # ==========================================

    return success_response(

        message="Face detection completed successfully.",

        data={

            "image": {

                "filename": image_data.filename,

                "width": image_data.width,

                "height": image_data.height,

                "channels": image_data.channels

            },

            "face_count": len(faces),

            "faces": Serializer.serialize(faces)

        },

        meta={

            "request_id": request_id,

            "processing_time_ms": processing_time

        }

    )