"""
==================================================
Smart Attendance AI
Recognition API
==================================================
Recognizes a student by comparing an uploaded
face against registered embeddings.
==================================================
"""

import json

from typing import List

from fastapi import APIRouter
from fastapi import File
from fastapi import Form
from fastapi import UploadFile

from core.image_data import ImageData
from core.student_embedding import StudentEmbedding

from services.image_service import ImageService
from services.recognizer_service import RecognizerService

from utils.request import Request as RequestUtil
from utils.response import Response
from utils.serializer import Serializer


router = APIRouter()


@router.post(
    "/recognize",
    summary="Recognize Student"
)
async def recognize_student(
    image: UploadFile = File(...),
    students: str = Form(...)
):
    """
    Recognize one student from an uploaded image.
    """

    # ------------------------------------------
    # Generate Request ID
    # ------------------------------------------

    request_id = RequestUtil.generate_id()

    # ------------------------------------------
    # Read Uploaded Image
    # ------------------------------------------

    image_data: ImageData = await ImageService.read(
        image
    )

    # ------------------------------------------
    # Parse Student List
    # ------------------------------------------

    student_list: List[dict] = json.loads(
        students
    )

    # ------------------------------------------
    # Validate Student List
    # ------------------------------------------

    if not student_list:

        return Response.error(

            message="No student embeddings provided."

        )

    # ------------------------------------------
    # Convert JSON -> StudentEmbedding Objects
    # ------------------------------------------

    embeddings: List[StudentEmbedding] = [

        StudentEmbedding(

            student_id=item["student_id"],

            embedding=item["embedding"]

        )

        for item in student_list

    ]

    # ------------------------------------------
    # Recognition
    # ------------------------------------------

    result = RecognizerService.recognize(

        image=image_data,

        students=embeddings

    )

    # ------------------------------------------
    # Response
    # ------------------------------------------

    return Response.success(

        message="Recognition completed successfully.",

        data=Serializer.serialize(
            result
        )

    )