"""
==================================================
Smart Attendance AI
Embedding API
==================================================
Extracts 512-dimensional face embeddings.
==================================================
"""

from fastapi import APIRouter
from fastapi import File
from fastapi import UploadFile

from core.image_data import ImageData

from services.image_service import ImageService
from services.inference_service import InferenceService
from services.embedding_service import EmbeddingService

from utils.request import Request as RequestUtil
from utils.response import Response
from utils.serializer import Serializer


router = APIRouter()


@router.post(
    "/embed",
    summary="Extract Face Embeddings",
    description="Detect faces and extract 512-dimensional embeddings."
)
async def embed_face(
    image: UploadFile = File(...)
):
    """
    Extract embeddings from all detected faces.
    """

    # ------------------------------------------
    # Request ID
    # ------------------------------------------

    request_id = RequestUtil.generate_id()

    # ------------------------------------------
    # Read & Validate Image
    # ------------------------------------------

    image_data: ImageData = await ImageService.read(
        image
    )

    # ------------------------------------------
    # AI Inference
    # ------------------------------------------

    raw_faces = InferenceService.infer(
        image_data
    )

    # ------------------------------------------
    # Convert to Embedding Results
    # ------------------------------------------

    embeddings = EmbeddingService.extract(
        raw_faces
    )

    # ------------------------------------------
    # Response
    # ------------------------------------------

    return Response.success(

        message="Embedding extracted successfully.",

        data={

            "face_count": len(embeddings),

            "faces": Serializer.serialize_list(
                embeddings
            )

        }

    )