import cv2
import socketio
import time

# 1. Connexion au serveur Node.js (Le "Terminal de contrôle")
sio = socketio.Client()

@sio.event
def connect():
    print("✅ Moteur IA : Connecté au serveur de contrôle.")

@sio.event
def disconnect():
    print("❌ Moteur IA : Déconnecté.")

try:
    sio.connect('http://localhost:3000')
except:
    print("Erreur : Impossible de contacter le serveur sur le port 3000.")

# 2. Chargement de l'intelligence de détection (Haar Cascade)
# C'est un fichier XML qui contient les données pour reconnaître un visage
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 3. Accès à la caméra
for i in range(5):
    cap = cv2.VideoCapture(i)
    if cap.isOpened():
        print(f"✅ Caméra trouvée sur l'index {i}")
        break
else:
    print("❌ Aucune caméra n'a pu être ouverte.")
    exit()

print("🔍 The Watcher est en veille... (Appuyez sur 'q' pour quitter)")

while True:
    # Lire une image du flux vidéo
    ret, frame = cap.read()
    if not ret:
        break

    # Convertir en noir et blanc pour accélérer la détection
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Détecter les visages
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

    # Si un visage est trouvé
    for (x, y, w, h) in faces:
        print("👤 ALERTE : Visage détecté !")
        
        # Envoyer l'information au Dashboard via Socket.io
        sio.emit('ai_detection', {
            'message': 'Intrus détecté !',
            'timestamp': time.strftime("%H:%M:%S")
        })

        # Dessiner un rectangle bleu autour du visage sur le flux local
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        cv2.putText(frame, "CIBLE DETECTEE", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    # Afficher la fenêtre de vision (Optionnel pour le serveur, mais utile pour débugger)
    cv2.imshow('The Watcher - Vision Engine', frame)

    # Sortir si on appuie sur 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Nettoyage
cap.release()
cv2.destroyAllWindows()
sio.disconnect()