from fastapi import FastAPI, File, UploadFile
import face_recognition
import numpy as np
import shutil
import os
import json
import uuid

app = FastAPI()

ENCODINGS_DIR = "encodings"
THRESHOLD = 0.5  # puedes ajustar (0.45 más estricto)

def cargar_encodings():
    data = []
    for file in os.listdir(ENCODINGS_DIR):
        if file.endswith(".json"):
            user_id = file.replace(".json", "")
            with open(os.path.join(ENCODINGS_DIR, file), "r") as f:
                encoding = np.array(json.load(f))
                data.append({
                    "user_id": user_id,
                    "encoding": encoding
                })
    return data

@app.post("/reconocer/")
async def reconocer(file: UploadFile = File(...)):

    # Guardar temporal
    filename = f"temp_{uuid.uuid4().hex}.jpg"
    with open(filename, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    try:
        # Cargar imagen
        image = face_recognition.load_image_file(filename)
        encodings = face_recognition.face_encodings(image)

        if len(encodings) == 0:
            return {
                "ok": False,
                "error": "No se detectó rostro"
            }

        encoding_nuevo = encodings[0]

        # Cargar base
        base = cargar_encodings()

        mejor_match = None
        mejor_distancia = 1.0

        for item in base:
            distancia = face_recognition.face_distance(
                [item["encoding"]],
                encoding_nuevo
            )[0]

            if distancia < mejor_distancia:
                mejor_distancia = distancia
                mejor_match = item["user_id"]

        if mejor_match and mejor_distancia < THRESHOLD:
            return {
                "ok": True,
                "match": True,
                "empleado": mejor_match,
                "distance": float(mejor_distancia)
            }
        else:
            return {
                "ok": True,
                "match": False,
                "distance": float(mejor_distancia)
            }

    finally:
        # limpiar archivo temporal
        if os.path.exists(filename):
            os.remove(filename)