<?php
// Archivo para manejar operaciones de códigos QR
require_once __DIR__ . '/../../modelos/CodigoQR.php';

// Crear instancia del modelo
$codigoQR = new CodigoQR($conn);

// Obtener datos adicionales según el tipo de operación
switch ($tipo) {
    case 'generarLoteQR':
        try {
            // Validar datos requeridos
            $cantidad = isset($datapost['cantidad']) ? (int)$datapost['cantidad'] : 48;
            $nombreLote = isset($datapost['nombre_lote']) ? $datapost['nombre_lote'] : null;
            $usuarioId = isset($_SESSION['usuario_id']) ? $_SESSION['usuario_id'] : null;

            if ($cantidad < 1 || $cantidad > 100) {
                sendResponse(false, "La cantidad debe estar entre 1 y 100");
            }

            if (!$nombreLote || empty(trim($nombreLote))) {
                sendResponse(false, "El nombre del lote es requerido");
            }

            $resultado = $codigoQR->generarLote($cantidad, trim($nombreLote), $usuarioId);

            sendResponse(true, "Lote de códigos QR generado exitosamente", $resultado);

        } catch (Exception $e) {
            error_log("Error generando lote QR: " . $e->getMessage());
            sendResponse(false, "Error generando lote: " . $e->getMessage());
        }
        break;

    case 'getLotesQR':
        try {
            // Obtener filtros
            $filtros = [];
            if (isset($datapost['estado']) && !empty($datapost['estado'])) {
                $filtros['estado'] = $datapost['estado'];
            }
            if (isset($datapost['fecha_desde']) && !empty($datapost['fecha_desde'])) {
                $filtros['fecha_desde'] = $datapost['fecha_desde'];
            }
            if (isset($datapost['fecha_hasta']) && !empty($datapost['fecha_hasta'])) {
                $filtros['fecha_hasta'] = $datapost['fecha_hasta'];
            }

            $lotes = $codigoQR->obtenerLotes($filtros);

            sendResponse(true, "Lotes obtenidos exitosamente", $lotes);

        } catch (Exception $e) {
            error_log("Error obteniendo lotes: " . $e->getMessage());
            sendResponse(false, "Error obteniendo lotes: " . $e->getMessage());
        }
        break;

    case 'getCodigosLote':
        try {
            $loteId = isset($datapost['lote_id']) ? (int)$datapost['lote_id'] : 0;

            if ($loteId <= 0) {
                sendResponse(false, "ID de lote inválido");
            }

            $codigos = $codigoQR->obtenerCodigosLote($loteId);

            sendResponse(true, "Códigos del lote obtenidos exitosamente", $codigos);

        } catch (Exception $e) {
            error_log("Error obteniendo códigos del lote: " . $e->getMessage());
            sendResponse(false, "Error obteniendo códigos: " . $e->getMessage());
        }
        break;

    case 'asignarQRCliente':
        try {
            $codigoQRId = isset($datapost['codigo_qr_id']) ? (int)$datapost['codigo_qr_id'] : 0;
            $clienteId = isset($datapost['cliente_id']) ? (int)$datapost['cliente_id'] : 0;
            $usuarioId = isset($_SESSION['usuario_id']) ? $_SESSION['usuario_id'] : null;

            if ($codigoQRId <= 0) {
                sendResponse(false, "ID de código QR inválido");
            }

            if ($clienteId <= 0) {
                sendResponse(false, "ID de cliente inválido");
            }

            $resultado = $codigoQR->asignarACliente($codigoQRId, $clienteId, $usuarioId);

            if ($resultado) {
                sendResponse(true, "Código QR asignado al cliente exitosamente");
            } else {
                sendResponse(false, "Error asignando código QR al cliente");
            }

        } catch (Exception $e) {
            error_log("Error asignando código QR: " . $e->getMessage());
            sendResponse(false, "Error asignando código QR: " . $e->getMessage());
        }
        break;

    case 'desasignarQRCliente':
        try {
            $clienteId = isset($datapost['cliente_id']) ? (int)$datapost['cliente_id'] : 0;
            $usuarioId = isset($_SESSION['usuario_id']) ? $_SESSION['usuario_id'] : null;

            if ($clienteId <= 0) {
                sendResponse(false, "ID de cliente inválido");
            }

            $resultado = $codigoQR->desasignarDeCliente($clienteId, $usuarioId);

            if ($resultado) {
                sendResponse(true, "Código QR desasignado del cliente exitosamente");
            } else {
                sendResponse(false, "Error desasignando código QR del cliente");
            }

        } catch (Exception $e) {
            error_log("Error desasignando código QR: " . $e->getMessage());
            sendResponse(false, "Error desasignando código QR: " . $e->getMessage());
        }
        break;

    case 'getQRDisponibles':
        try {
            $limite = isset($datapost['limite']) ? (int)$datapost['limite'] : 100;
            
            if ($limite > 500) {
                $limite = 500; // Límite máximo por seguridad
            }

            $codigos = $codigoQR->obtenerDisponibles($limite);

            sendResponse(true, "Códigos QR disponibles obtenidos exitosamente", $codigos);

        } catch (Exception $e) {
            error_log("Error obteniendo códigos disponibles: " . $e->getMessage());
            sendResponse(false, "Error obteniendo códigos disponibles: " . $e->getMessage());
        }
        break;

    case 'getQRAsignado':
        try {
            $codigoQRId = isset($datapost['codigo_qr_id']) ? (int)$datapost['codigo_qr_id'] : 0;
            
            if ($codigoQRId <= 0) {
                sendResponse(false, "ID de código QR inválido");
            }

            $codigo = $codigoQR->obtenerPorId($codigoQRId);

            if ($codigo) {
                sendResponse(true, "Código QR obtenido exitosamente", $codigo);
            } else {
                sendResponse(false, "Código QR no encontrado");
            }

        } catch (Exception $e) {
            error_log("Error obteniendo código QR asignado: " . $e->getMessage());
            sendResponse(false, "Error obteniendo código QR: " . $e->getMessage());
        }
        break;

    case 'getEstadisticasQR':
        try {
            $estadisticas = $codigoQR->obtenerEstadisticas();

            sendResponse(true, "Estadísticas obtenidas exitosamente", $estadisticas);

        } catch (Exception $e) {
            error_log("Error obteniendo estadísticas QR: " . $e->getMessage());
            sendResponse(false, "Error obteniendo estadísticas: " . $e->getMessage());
        }
        break;

    case 'marcarLoteImpreso':
        try {
            $loteId = isset($datapost['lote_id']) ? (int)$datapost['lote_id'] : 0;

            if ($loteId <= 0) {
                sendResponse(false, "ID de lote inválido");
            }

            $resultado = $codigoQR->marcarLoteImpreso($loteId);

            if ($resultado) {
                sendResponse(true, "Lote marcado como impreso exitosamente");
            } else {
                sendResponse(false, "Error marcando lote como impreso");
            }

        } catch (Exception $e) {
            error_log("Error marcando lote como impreso: " . $e->getMessage());
            sendResponse(false, "Error marcando lote como impreso: " . $e->getMessage());
        }
        break;

    case 'marcarLoteComoUsado':
        try {
            $loteId = isset($datapost['lote_id']) ? (int)$datapost['lote_id'] : 0;

            if ($loteId <= 0) {
                sendResponse(false, "ID de lote inválido");
            }

            $resultado = $codigoQR->marcarLoteComoUsado($loteId);

            if ($resultado) {
                sendResponse(true, "Lote marcado como usado exitosamente");
            } else {
                sendResponse(false, "Error marcando lote como usado");
            }

        } catch (Exception $e) {
            error_log("Error marcando lote como usado: " . $e->getMessage());
            sendResponse(false, "Error marcando lote como usado: " . $e->getMessage());
        }
        break;

    case 'marcarCodigoComoUsado':
        try {
            $codigoId = isset($datapost['codigo_id']) ? (int)$datapost['codigo_id'] : 0;

            if ($codigoId <= 0) {
                sendResponse(false, "ID de código inválido");
            }

            $resultado = $codigoQR->marcarCodigoComoUsado($codigoId);

            if ($resultado) {
                sendResponse(true, "Código marcado como usado exitosamente");
            } else {
                sendResponse(false, "Error marcando código como usado");
            }

        } catch (Exception $e) {
            error_log("Error marcando código como usado: " . $e->getMessage());
            sendResponse(false, "Error marcando código como usado: " . $e->getMessage());
        }
        break;

    case 'eliminarLoteQR':
        try {
            $loteId = isset($datapost['lote_id']) ? (int)$datapost['lote_id'] : 0;

            if ($loteId <= 0) {
                sendResponse(false, "ID de lote inválido");
            }

            $resultado = $codigoQR->eliminarLote($loteId);

            if ($resultado) {
                sendResponse(true, "Lote eliminado exitosamente");
            } else {
                sendResponse(false, "Error eliminando lote");
            }

        } catch (Exception $e) {
           // error_log("Error eliminando lote: " . $e->getMessage());
            sendResponse(false, "Error eliminando lote: " . $e->getMessage());
        }
        break;

    case 'getHistorialQR':
        try {
            $codigoQRId = isset($datapost['codigo_qr_id']) ? (int)$datapost['codigo_qr_id'] : 0;
            $limite = isset($datapost['limite']) ? (int)$datapost['limite'] : 50;

            if ($codigoQRId <= 0) {
                sendResponse(false, "ID de código QR inválido");
            }

            // Obtener historial desde la tabla historial_qr
            $query = "SELECT 
                        h.*,
                        u.nombre as usuario_nombre,
                        ca.nombre_comercial as cliente_anterior_nombre,
                        cn.nombre_comercial as cliente_nuevo_nombre
                      FROM historial_qr h
                      LEFT JOIN usuarios u ON h.usuario_id = u.id
                      LEFT JOIN clientes ca ON h.cliente_anterior_id = ca.id
                      LEFT JOIN clientes cn ON h.cliente_nuevo_id = cn.id
                      WHERE h.codigo_qr_id = :codigo_qr_id
                      ORDER BY h.created_at DESC
                      LIMIT :limite";

            $stmt = $conn->prepare($query);
            $stmt->bindParam(':codigo_qr_id', $codigoQRId);
            $stmt->bindParam(':limite', $limite, PDO::PARAM_INT);
            $stmt->execute();

            $historial = $stmt->fetchAll(PDO::FETCH_ASSOC);

            sendResponse(true, "Historial obtenido exitosamente", $historial);

        } catch (Exception $e) {
            error_log("Error obteniendo historial QR: " . $e->getMessage());
            sendResponse(false, "Error obteniendo historial: " . $e->getMessage());
        }
        break;

    case 'identificarCliente':
        try {
            error_log("=== IDENTIFICAR CLIENTE POR QR ===");

            // Obtener el código QR escaneado
            $codigoQR = isset($datapost['codigo_qr']) ? trim($datapost['codigo_qr']) : null;
            $codigo = isset($datapost['codigo']) ? trim($datapost['codigo']) : $codigoQR;

            if (empty($codigo)) {
                sendResponse(false, "Código QR requerido");
            }

            error_log("Buscando código QR: " . $codigo);

            // Buscar el código QR en la base de datos
            $query = "SELECT
                        qr.id as qr_id,
                        qr.codigo as qr_codigo,
                        qr.codigo_qr,
                        qr.estado as qr_estado,
                        qr.cliente_id,
                        c.id,
                        c.codigo,
                        c.nombre_comercial,
                        c.nombre,
                        c.apellidos,
                        c.direccion,
                        c.telefono,
                        c.telefono_secundario,
                        c.latitud,
                        c.longitud,
                        c.activo,
                        c.tiene_credito
                      FROM codigos_qr qr
                      INNER JOIN clientes c ON qr.cliente_id = c.id
                      WHERE qr.codigo = :codigo1
                         OR qr.codigo_qr = :codigo2
                      LIMIT 1";

            $stmt = $conn->prepare($query);
            $stmt->bindParam(':codigo1', $codigo);
            $stmt->bindParam(':codigo2', $codigo);
            $stmt->execute();

            $resultado = $stmt->fetch(PDO::FETCH_ASSOC);

            if (!$resultado) {
                error_log("Código QR no encontrado o no asignado a cliente");
                sendResponse(false, "Código QR no encontrado o no está asignado a un cliente");
            }

            // Verificar que el cliente esté activo
            if (!$resultado['activo']) {
                sendResponse(false, "El cliente asociado a este QR está inactivo");
            }

            // Estructurar la respuesta
            $clienteData = [
                'id' => $resultado['id'],
                'codigo' => $resultado['codigo'],
                'nombre_comercial' => $resultado['nombre_comercial'],
                'nombre' => $resultado['nombre'],
                'apellidos' => $resultado['apellidos'],
                'direccion' => $resultado['direccion'],
                'telefono' => $resultado['telefono'],
                'telefono_secundario' => $resultado['telefono_secundario'],
                'latitud' => $resultado['latitud'],
                'longitud' => $resultado['longitud'],
                'activo' => $resultado['activo'],
                'tiene_credito' => (bool)$resultado['tiene_credito'],
                'codigo_qr' => [
                    'id' => $resultado['qr_id'],
                    'codigo' => $resultado['qr_codigo'],
                    'estado' => $resultado['qr_estado']
                ]
            ];

            error_log("Cliente identificado: ID=" . $clienteData['id'] . ", Nombre=" . $clienteData['nombre_comercial']);

            sendResponse(true, "Cliente identificado exitosamente", $clienteData);

        } catch (Exception $e) {
            error_log("Error identificando cliente por QR: " . $e->getMessage());
            sendResponse(false, "Error identificando cliente: " . $e->getMessage());
        }
        break;

    default:
        sendResponse(false, "Operación de códigos QR no válida");
        break;
}
?>