<?php

/**
 * Biometrico.php - Manejo de operaciones del dispositivo biométrico MB160
 * Este archivo procesa las operaciones relacionadas con el dispositivo biométrico
 */

// Si se accede directamente, denegar acceso
//if (!defined('BASEPATH')) exit('No direct script access allowed');

// Función para manejar errores y convertirlos en respuestas JSON
function handleBiometricError($error, $message = 'Error en la operación biométrica')
{
  error_log("Error biométrico: " . print_r($error, true));
  sendResponse(false, $message);
}

// Conectar al dispositivo biométrico
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'connectBiometric') {
  try {
    // Aquí incluirías la lógica para conectar con el dispositivo
    // Ejemplo usando una librería hipotética (debes adaptarla a tu caso específico)
    require_once('libs/mb160/MB160.php');

    $mb160 = new MB160(); // Instancia de la librería del biométrico
    $result = $mb160->connect();

    if ($result) {
      // Obtener información del dispositivo
      $deviceInfo = $mb160->getDeviceInfo();

      sendResponse(true, "Dispositivo conectado correctamente", [
        'deviceInfo' => $deviceInfo
      ]);
    } else {
      sendResponse(false, "No se pudo conectar con el dispositivo biométrico");
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error al conectar con el dispositivo biométrico");
  }
}

// Desconectar el dispositivo biométrico
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'disconnectBiometric') {
  try {
    require_once('libs/mb160/MB160.php');

    $mb160 = new MB160();
    $result = $mb160->disconnect();

    if ($result) {
      sendResponse(true, "Dispositivo desconectado correctamente");
    } else {
      sendResponse(false, "No se pudo desconectar el dispositivo biométrico");
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error al desconectar el dispositivo biométrico");
  }
}

// Capturar huella digital
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'captureBiometric') {
  try {
    require_once('libs/mb160/MB160.php');

    $mb160 = new MB160();
    $result = $mb160->capture();

    if ($result) {
      // La captura fue exitosa
      sendResponse(true, "Huella capturada correctamente", [
        'quality' => $mb160->getImageQuality(),
        'templateData' => base64_encode($mb160->getTemplateData())
      ]);
    } else {
      sendResponse(false, "No se pudo capturar la huella digital. Intente nuevamente");
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error durante la captura de huella");
  }
}

// Registrar huella en la base de datos
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'enrollBiometric') {
  try {
    // Verificar los datos necesarios
    if (!isset($datapost['userId']) || !isset($datapost['fingerIndex'])) {
      sendResponse(false, "Datos incompletos para el registro de huella");
      exit;
    }

    $userId = intval($datapost['userId']);
    $fingerIndex = intval($datapost['fingerIndex']);
    $userName = isset($datapost['userName']) ? $datapost['userName'] : '';

    require_once('libs/mb160/MB160.php');

    $mb160 = new MB160();

    // Obtener la plantilla de huella del dispositivo
    $templateData = $mb160->getFinalTemplate();

    if (!$templateData) {
      sendResponse(false, "No se pudo obtener la plantilla de huella final");
      exit;
    }

    // Guardar en la base de datos
    $query = "INSERT INTO biometric_fingerprints 
                  (user_id, finger_index, template_data, register_date, user_name) 
                  VALUES (?, ?, ?, NOW(), ?)";

    $stmt = $conn->prepare($query);
    $blobData = $templateData; // Datos binarios de la plantilla
    $stmt->bind_param("iiss", $userId, $fingerIndex, $blobData, $userName);
    $result = $stmt->execute();

    if ($result) {
      sendResponse(true, "Huella registrada correctamente");
    } else {
      sendResponse(false, "Error al guardar la huella en la base de datos");
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error durante el registro de huella");
  }
}

// Verificar huella
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'verifyBiometric') {
  try {
    // Verificar los datos necesarios
    if (!isset($datapost['userId']) || !isset($datapost['templateData'])) {
      sendResponse(false, "Datos incompletos para la verificación de huella");
      exit;
    }

    $userId = intval($datapost['userId']);
    $templateData = base64_decode($datapost['templateData']);

    require_once('libs/mb160/MB160.php');

    $mb160 = new MB160();

    // Obtener las huellas del usuario de la base de datos
    $query = "SELECT * FROM biometric_fingerprints WHERE user_id = ?";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $result = $stmt->get_result();

    if ($result->num_rows === 0) {
      sendResponse(false, "No hay huellas registradas para este usuario");
      exit;
    }

    // Verificar contra cada huella del usuario
    $bestMatchScore = 0;
    $matchFound = false;

    while ($fingerprint = $result->fetch_assoc()) {
      $storedTemplate = $fingerprint['template_data'];

      // Comparar las huellas
      $score = $mb160->compare($templateData, $storedTemplate);

      if ($score > $bestMatchScore) {
        $bestMatchScore = $score;
      }

      // Si supera el umbral, es una coincidencia
      if ($score >= 70) { // Umbral de coincidencia (ajustar según necesidades)
        $matchFound = true;
      }
    }

    if ($matchFound) {
      sendResponse(true, "Verificación exitosa", [
        'matchScore' => $bestMatchScore
      ]);
    } else {
      sendResponse(false, "La huella no coincide con ninguna huella registrada", [
        'matchScore' => $bestMatchScore
      ]);
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error durante la verificación de huella");
  }
}

// Eliminar huella
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'deleteBiometric') {
  try {
    // Verificar los datos necesarios
    if (!isset($datapost['idFingerprint'])) {
      sendResponse(false, "ID de huella no proporcionado");
      exit;
    }

    $idFingerprint = intval($datapost['idFingerprint']);

    // Eliminar de la base de datos
    $query = "DELETE FROM biometric_fingerprints WHERE id = ?";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $idFingerprint);
    $result = $stmt->execute();

    if ($result && $stmt->affected_rows > 0) {
      sendResponse(true, "Huella eliminada correctamente");
    } else {
      sendResponse(false, "No se pudo eliminar la huella o no existe");
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error al eliminar la huella");
  }
}

// Obtener huellas de un usuario
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'getUserFingerprints') {
  try {
    // Verificar los datos necesarios
    if (!isset($datapost['idUsuario'])) {
      sendResponse(false, "ID de usuario no proporcionado");
      exit;
    }

    $userId = intval($datapost['idUsuario']);

    // Consultar la base de datos
    $query = "SELECT id as idFingerprint, finger_index as fingerIndex, 
                  register_date as registerDate, user_name as userName 
                  FROM biometric_fingerprints WHERE user_id = ?";

    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $result = $stmt->get_result();

    $fingerprints = [];
    while ($row = $result->fetch_assoc()) {
      // No incluir los datos binarios de la plantilla en la respuesta
      $fingerprints[] = $row;
    }

    sendResponse(true, "Huellas obtenidas correctamente", [
      'huellas' => $fingerprints
    ]);
  } catch (Exception $e) {
    handleBiometricError($e, "Error al obtener las huellas del usuario");
  }
}

// Cancelar operación actual
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'cancelBiometric') {
  try {
    require_once('libs/mb160/MB160.php');

    $mb160 = new MB160();
    $result = $mb160->cancelOperation();

    if ($result) {
      sendResponse(true, "Operación cancelada correctamente");
    } else {
      sendResponse(false, "No se pudo cancelar la operación");
    }
  } catch (Exception $e) {
    handleBiometricError($e, "Error al cancelar la operación");
  }
}

// Listar dispositivos disponibles
if (isset($datapost) && isset($datapost['tipo']) && $datapost['tipo'] === 'listBiometricDevices') {
  try {
    require_once('libs/mb160/MB160.php');

    $devices = MB160::listDevices();

    sendResponse(true, "Dispositivos listados correctamente", [
      'devices' => $devices
    ]);
  } catch (Exception $e) {
    handleBiometricError($e, "Error al listar dispositivos disponibles");
  }
}

// Si no se reconoce el tipo de solicitud
// No enviar respuesta aquí, ya que este archivo se incluye en api.php 
// y puede haber otras rutas por procesar
