import cv2
import os
import json
import numpy as np

# ⚡ Importamos tus motores exactos para no romper la simetría
from reconocimiento2 import detectar_rostros_yunet, gestionar_vectores

def registrar_desde_webcam():
    print("\n" + "="*50)
    print("📸 MÓDULO DE REGISTRO LIMPIO (WEBCAM LOCAL)")
    print("Alinea tu rostro, mira a la cámara con buena luz.")
    print("Presiona [R] para capturar | [Q] para salir")
    print("="*50 + "\n")

    DB_PATH = "db_institucion"
    CACHE_PATH = "cache_nombres"
    os.makedirs(DB_PATH, exist_ok=True)
    os.makedirs(CACHE_PATH, exist_ok=True)

    # 0 es la cámara por defecto de tu laptop
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("[!] Error: No se pudo abrir la webcam local.")
        return

    while True:
        ret, frame = cap.read()
        if not ret: continue

        # Espejamos la imagen para que actúe como un espejo natural
        frame = cv2.flip(frame, 1)
        display_frame = frame.copy()

        # Usamos YuNet para garantizar que estamos capturando una cara válida
        faces = detectar_rostros_yunet(frame)
        mejor_rostro = None
        max_area = 0

        for (fx, fy, fw, fh, score) in faces:
            area = fw * fh
            cv2.rectangle(display_frame, (fx, fy), (fx+fw, fy+fh), (0, 255, 0), 2)
            
            if area > max_area:
                max_area = area
                h_frame, w_frame = frame.shape[:2]
                
                # Mismo margen del 30% que requiere MTCNN para alinear correctamente
                m_x, m_y = int(fw * 0.30), int(fh * 0.30)
                y1 = max(0, fy - m_y)
                y2 = min(h_frame, fy + fh + m_y)
                x1 = max(0, fx - m_x)
                x2 = min(w_frame, fx + fw + m_x)
                
                mejor_rostro = frame[y1:y2, x1:x2]

        cv2.putText(display_frame, "Alineate y presiona [R]", (10, 30), 
                    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)
        cv2.imshow("Registro Webcam Local", display_frame)

        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break
        elif key == ord('r'):
            if mejor_rostro is not None and mejor_rostro.size > 0:
                cv2.imshow("Captura Congelada", mejor_rostro)
                cv2.waitKey(1)
                
                print("\n--- NUEVO REGISTRO ---")
                nom = input("Escribe el nombre exacto de la persona: ").strip()
                
                if nom:
                    gen_input = input("¿Es Hombre (h) o Mujer (m)?: ").strip().lower()
                    genero_guardado = "Woman" if gen_input == 'm' else "Man"
                    
                    # 1. Guardamos la foto pura
                    foto_path = os.path.join(DB_PATH, f"{nom}.jpg")
                    cv2.imwrite(foto_path, mejor_rostro)
                    
                    # 2. Actualizamos el caché de géneros sin usar IA
                    ruta_generos = os.path.join(CACHE_PATH, "generos.json")
                    dic_generos = {}
                    if os.path.exists(ruta_generos):
                        try:
                            with open(ruta_generos, 'r') as f:
                                dic_generos = json.load(f)
                        except Exception: pass
                    
                    dic_generos[nom] = genero_guardado
                    with open(ruta_generos, 'w') as f:
                        json.dump(dic_generos, f)
                        
                    print(f"\n[OK] Foto guardada. Generando punto de gravedad matemático...")
                    
                    # 3. Forzamos la creación del vector en la base de datos
                    gestionar_vectores(actualizar=True)
                    print(" Registro inyectado exitosamente en el sistema principal.")
                    
                else:
                    print("[!] Registro cancelado por nombre vacío.")
                
                cv2.destroyWindow("Captura Congelada")
            else:
                print("[!] No se detectó ningún rostro claro. Acércate más a la luz.")

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    registrar_desde_webcam()