<?php
/**
 * Funciones para el registro de actividades de usuarios
 */

// Asegurar que tenemos conexión a la base de datos
if (!function_exists('obtenerConexion')) {
    /**
     * Obtiene una conexión a la base de datos
     * 
     * @return PDO|mysqli Objeto de conexión a la base de datos
     */
    function obtenerConexion() {
        // Verificar si ya existe una conexión global
        global $conn;
        if (isset($conn) && $conn instanceof mysqli && $conn->ping()) {
            return $conn;
        }
        
        // Si estamos usando la clase Database (PDO)
        if (class_exists('Database')) {
            try {
                $db = new Database();
                return $db->getPDO();
            } catch (Exception $e) {
                error_log("Error al obtener conexión PDO: " . $e->getMessage());
                // Intentar con mysqli si PDO falla
            }
        }
        
        // Intentar obtener la conexión desde config.php
        if (!isset($conn) || !($conn instanceof mysqli)) {
            // Intentar incluir el archivo de configuración si no está ya incluido
            if (!function_exists('conectarDB') && file_exists(__DIR__ . '/conexion.php')) {
                require_once __DIR__ . '/conexion.php';
                $conn = conectarDB();
            } else if (file_exists(__DIR__ . '/db.php')) {
                require_once __DIR__ . '/db.php';
                $db = new Database();
                return $db->getPDO(); // Retornar conexión PDO
            }
        }
        
        return $conn;
    }
}

/**
 * Registra una actividad realizada por un usuario en el sistema
 * 
 * @param int $idUsuario ID del usuario que realiza la acción
 * @param string $tipoAccion Tipo de acción (inicio_sesion, cierre_sesion, pago, etc.)
 * @param string $detallesAccion Detalles adicionales de la acción
 * @return bool True si se registró correctamente, False en caso contrario
 */
function registrarActividadUsuario($idUsuario, $tipoAccion, $detallesAccion = null) {
    $conexion = obtenerConexion();
    
    if (!$conexion) {
        error_log("No se pudo obtener la conexión a la base de datos en registrarActividadUsuario");
        return false;
    }
    
    $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
    $agenteUsuario = $_SERVER['HTTP_USER_AGENT'] ?? 'Desconocido';
    
    // Verificar si la tabla existe, crearla si no existe
    crearTablaRegistroSiNoExiste($conexion);
    
    // Ejecutar según el tipo de conexión (mysqli o PDO)
    if ($conexion instanceof mysqli) {
        $stmt = $conexion->prepare("INSERT INTO registro_actividad_usuario (id_usuario, tipo_accion, detalles_accion, direccion_ip, agente_usuario) 
                               VALUES (?, ?, ?, ?, ?)");
        
        if (!$stmt) {
            error_log("Error preparando la consulta (mysqli): " . $conexion->error);
            return false;
        }
        
        $stmt->bind_param("issss", $idUsuario, $tipoAccion, $detallesAccion, $ip, $agenteUsuario);
        $resultado = $stmt->execute();
        
        if (!$resultado) {
            error_log("Error ejecutando la consulta (mysqli): " . $stmt->error);
        }
        
        $stmt->close();
        return $resultado;
    } 
    else if ($conexion instanceof PDO) {
        try {
            $stmt = $conexion->prepare("INSERT INTO registro_actividad_usuario (id_usuario, tipo_accion, detalles_accion, direccion_ip, agente_usuario) 
                                   VALUES (?, ?, ?, ?, ?)");
            
            if (!$stmt) {
                error_log("Error preparando la consulta (PDO)");
                return false;
            }
            
            $resultado = $stmt->execute([$idUsuario, $tipoAccion, $detallesAccion, $ip, $agenteUsuario]);
            
            if (!$resultado) {
                error_log("Error ejecutando la consulta (PDO): " . implode(", ", $stmt->errorInfo()));
            }
            
            return $resultado;
        } catch (PDOException $e) {
            error_log("Error PDO en registrarActividadUsuario: " . $e->getMessage());
            return false;
        }
    }
    
    error_log("Tipo de conexión no soportado");
    return false;
}

/**
 * Crea la tabla de registro de actividad si no existe
 * 
 * @param PDO|mysqli $conexion Conexión a la base de datos
 * @return bool True si la tabla ya existía o se creó correctamente
 */
function crearTablaRegistroSiNoExiste($conexion) {
    $sql = "CREATE TABLE IF NOT EXISTS registro_actividad_usuario (
        id INT AUTO_INCREMENT PRIMARY KEY,
        id_usuario INT NOT NULL,
        tipo_accion VARCHAR(50) NOT NULL,
        detalles_accion TEXT,
        direccion_ip VARCHAR(45),
        agente_usuario VARCHAR(255),
        fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        INDEX (id_usuario),
        INDEX (tipo_accion)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
    
    if ($conexion instanceof mysqli) {
        return $conexion->query($sql) !== false;
    } 
    else if ($conexion instanceof PDO) {
        try {
            return $conexion->exec($sql) !== false;
        } catch (PDOException $e) {
            error_log("Error creando tabla registro_actividad_usuario: " . $e->getMessage());
            return false;
        }
    }
    
    return false;
}

/**
 * Obtiene el historial de actividades de un usuario específico
 * 
 * @param int $idUsuario ID del usuario
 * @param int $limite Cantidad máxima de registros a obtener
 * @return array Arreglo con las actividades del usuario
 */
function obtenerHistorialUsuario($idUsuario, $limite = 100) {
    $conexion = obtenerConexion();
    
    if (!$conexion) {
        error_log("No se pudo obtener la conexión a la base de datos en obtenerHistorialUsuario");
        return [];
    }
    
    if ($conexion instanceof mysqli) {
        $stmt = $conexion->prepare("SELECT * FROM registro_actividad_usuario WHERE id_usuario = ? ORDER BY fecha_creacion DESC LIMIT ?");
        
        if (!$stmt) {
            error_log("Error preparando la consulta (mysqli): " . $conexion->error);
            return [];
        }
        
        $stmt->bind_param("ii", $idUsuario, $limite);
        $stmt->execute();
        
        $resultado = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
        $stmt->close();
        
        return $resultado;
    } 
    else if ($conexion instanceof PDO) {
        try {
            $stmt = $conexion->prepare("SELECT * FROM registro_actividad_usuario WHERE id_usuario = ? ORDER BY fecha_creacion DESC LIMIT ?");
            
            if (!$stmt) {
                error_log("Error preparando la consulta (PDO)");
                return [];
            }
            
            $stmt->execute([$idUsuario, $limite]);
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error PDO en obtenerHistorialUsuario: " . $e->getMessage());
            return [];
        }
    }
    
    return [];
}

/**
 * Obtiene actividades filtradas por tipo
 * 
 * @param string $tipoAccion Tipo de acción a filtrar
 * @param int $limite Cantidad máxima de registros a obtener
 * @return array Arreglo con las actividades filtradas
 */
function obtenerActividadesPorTipo($tipoAccion, $limite = 100) {
    $conexion = obtenerConexion();
    
    if (!$conexion) {
        error_log("No se pudo obtener la conexión a la base de datos en obtenerActividadesPorTipo");
        return [];
    }
    
    if ($conexion instanceof mysqli) {
        // Consulta para mysqli
        $stmt = $conexion->prepare("SELECT r.*, u.nombre as nombre_usuario 
                               FROM registro_actividad_usuario r
                               LEFT JOIN usuarios u ON r.id_usuario = u.id
                               WHERE r.tipo_accion = ? 
                               ORDER BY r.fecha_creacion DESC LIMIT ?");
        
        if (!$stmt) {
            error_log("Error preparando la consulta (mysqli): " . $conexion->error);
            return [];
        }
        
        $stmt->bind_param("si", $tipoAccion, $limite);
        $stmt->execute();
        
        $resultado = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
        $stmt->close();
        
        return $resultado;
    } 
    else if ($conexion instanceof PDO) {
        try {
            // Consulta para PDO
            $stmt = $conexion->prepare("SELECT r.*, u.nombre as nombre_usuario 
                                   FROM registro_actividad_usuario r
                                   LEFT JOIN usuarios u ON r.id_usuario = u.id
                                   WHERE r.tipo_accion = ? 
                                   ORDER BY r.fecha_creacion DESC LIMIT ?");
            
            if (!$stmt) {
                error_log("Error preparando la consulta (PDO)");
                return [];
            }
            
            $stmt->execute([$tipoAccion, $limite]);
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error PDO en obtenerActividadesPorTipo: " . $e->getMessage());
            return [];
        }
    }
    
    return [];
}
?>
