<?php
/**
 * Script para corregir usuarios con rol NULL o vacío en la base de datos
 * 
 * IMPORTANTE: Ejecutar este script una sola vez para corregir los datos
 * Luego eliminar este archivo por seguridad
 */

require_once 'config.php';
require_once 'auth.php';

// Solo permitir ejecución si es admin
checkLogin();
if (($_SESSION['role'] ?? '') !== 'admin') {
    die('Solo el administrador puede ejecutar este script');
}

try {
    $pdo = getDBConnection();
    if (!$pdo) {
        die('Error de conexión a la base de datos');
    }

    // Buscar usuarios con rol NULL o vacío
    $stmt = $pdo->query("SELECT id, username, role, ship_id, status FROM users WHERE role IS NULL OR role = ''");
    $usersWithEmptyRole = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    echo "<h2>Corrección de Roles Vacíos</h2>";
    echo "<p>Usuarios con rol NULL o vacío encontrados: <strong>" . count($usersWithEmptyRole) . "</strong></p>";
    
    if (count($usersWithEmptyRole) > 0) {
        echo "<h3>Usuarios a corregir:</h3>";
        echo "<table border='1' cellpadding='5' style='border-collapse: collapse; margin-bottom: 20px;'>";
        echo "<tr><th>ID</th><th>Usuario</th><th>Rol Actual</th><th>Ship ID</th><th>Status</th><th>Rol Asignado</th></tr>";
        
        $updated = 0;
        
        foreach ($usersWithEmptyRole as $user) {
            // Iniciar transacción para cada usuario individualmente
            $pdo->beginTransaction();
            
            try {
            // Determinar el rol según el ship_id
            if (!empty($user['ship_id']) && trim($user['ship_id']) !== '') {
                $newRole = 'sub-adm'; // Si tiene ship_id, es admin del buque
            } else {
                $newRole = 'user'; // Si no tiene ship_id, es usuario común
            }
            
            // Intentar actualizar el rol de diferentes formas
            $updateStmt = null;
            $rowsAffected = 0;
            
            // Método 1: Actualizar directamente sin condición WHERE adicional
            try {
                $updateStmt = $pdo->prepare("UPDATE users SET role = :role WHERE id = :id");
                $updateStmt->execute([':role' => $newRole, ':id' => $user['id']]);
                $rowsAffected = $updateStmt->rowCount();
            } catch (Exception $e) {
                error_log("Error en UPDATE método 1: " . $e->getMessage());
            }
            
            // Si no funcionó, intentar con condición explícita para NULL
            if ($rowsAffected === 0) {
                try {
                    $updateStmt2 = $pdo->prepare("UPDATE users SET role = :role WHERE id = :id AND (role IS NULL OR role = '' OR role = 'NULL')");
                    $updateStmt2->execute([':role' => $newRole, ':id' => $user['id']]);
                    $rowsAffected = $updateStmt2->rowCount();
                } catch (Exception $e) {
                    error_log("Error en UPDATE método 2: " . $e->getMessage());
                }
            }
            
            // Verificar que se actualizó correctamente
            $verifyStmt = $pdo->prepare("SELECT role, ship_id FROM users WHERE id = :id");
            $verifyStmt->execute([':id' => $user['id']]);
            $verified = $verifyStmt->fetch(PDO::FETCH_ASSOC);
            
            $success = false;
            if ($verified) {
                // Verificar que el rol se actualizó correctamente
                if ($verified['role'] === $newRole) {
                    $success = true;
                    $updated++;
                } else {
                    // Si el rol no coincide, intentar actualizar de nuevo sin transacción
                    try {
                        $forceUpdate = $pdo->prepare("UPDATE users SET role = :role WHERE id = :id");
                        $forceUpdate->execute([':role' => $newRole, ':id' => $user['id']]);
                        $verifyStmt2 = $pdo->prepare("SELECT role FROM users WHERE id = :id");
                        $verifyStmt2->execute([':id' => $user['id']]);
                        $verified2 = $verifyStmt2->fetch(PDO::FETCH_ASSOC);
                        if ($verified2 && $verified2['role'] === $newRole) {
                            $success = true;
                            $updated++;
                        }
                    } catch (Exception $e) {
                        error_log("Error en force update: " . $e->getMessage());
                    }
                }
            }
            
            if ($success) {
                echo "<tr style='background-color: #d4edda;'>";
            } else {
                echo "<tr style='background-color: #f8d7da;'>";
                error_log("Error actualizando usuario ID {$user['id']}: rowsAffected=$rowsAffected, verified=" . json_encode($verified));
            }
            
            echo "<td>{$user['id']}</td>";
            echo "<td>{$user['username']}</td>";
            echo "<td>" . ($user['role'] ?? 'NULL') . "</td>";
            echo "<td>" . ($user['ship_id'] ?? 'N/A') . "</td>";
            echo "<td>{$user['status']}</td>";
                echo "<td><strong>{$newRole}</strong>";
                if ($verified) {
                    echo " (Verificado: {$verified['role']})";
                }
                echo "</td>";
                echo "</tr>";
                
                // Hacer commit para este usuario
                if ($success) {
                    $pdo->commit();
                } else {
                    $pdo->rollBack();
                }
                
            } catch (Exception $e) {
                $pdo->rollBack();
                echo "<tr style='background-color: #f8d7da;'>";
                echo "<td>{$user['id']}</td>";
                echo "<td>{$user['username']}</td>";
                echo "<td>" . ($user['role'] ?? 'NULL') . "</td>";
                echo "<td>" . ($user['ship_id'] ?? 'N/A') . "</td>";
                echo "<td>{$user['status']}</td>";
                echo "<td><strong style='color: red;'>Error: " . htmlspecialchars($e->getMessage()) . "</strong></td>";
                echo "</tr>";
                error_log("Error actualizando usuario ID {$user['id']}: " . $e->getMessage());
            }
        }
        
        echo "</table>";
        
        if ($updated > 0) {
            echo "<p style='color: green; font-size: 18px;'><strong>✓ Se actualizaron {$updated} usuarios correctamente</strong></p>";
        } else {
            echo "<p style='color: red;'>No se pudo actualizar ningún usuario. Revisa los logs del servidor para más detalles.</p>";
        }
    } else {
        echo "<p style='color: blue;'>No hay usuarios con rol vacío. Todo está correcto.</p>";
    }
    
    // Mostrar resumen final
    echo "<h3>Resumen de roles en la base de datos:</h3>";
    $stmt = $pdo->query("SELECT role, COUNT(*) as count FROM users GROUP BY role ORDER BY role");
    $roles = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo "<table border='1' cellpadding='5' style='border-collapse: collapse;'>";
    echo "<tr><th>Rol</th><th>Cantidad</th></tr>";
    foreach ($roles as $role) {
        $roleName = $role['role'] ?? 'NULL';
        echo "<tr>";
        echo "<td><strong>{$roleName}</strong></td>";
        echo "<td>{$role['count']}</td>";
        echo "</tr>";
    }
    echo "</table>";
    
    // Mostrar todos los usuarios con sub-adm
    echo "<h3>Usuarios con rol 'sub-adm':</h3>";
    $stmt = $pdo->query("SELECT id, username, role, ship_id, status FROM users WHERE role = 'sub-adm' ORDER BY ship_id, username");
    $subAdmins = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    if (count($subAdmins) > 0) {
        echo "<table border='1' cellpadding='5' style='border-collapse: collapse;'>";
        echo "<tr><th>ID</th><th>Usuario</th><th>Rol</th><th>Ship ID</th><th>Status</th></tr>";
        foreach ($subAdmins as $admin) {
            echo "<tr>";
            echo "<td>{$admin['id']}</td>";
            echo "<td><strong>{$admin['username']}</strong></td>";
            echo "<td>{$admin['role']}</td>";
            echo "<td>{$admin['ship_id']}</td>";
            echo "<td>{$admin['status']}</td>";
            echo "</tr>";
        }
        echo "</table>";
    } else {
        echo "<p style='color: #8892b0;'>No hay usuarios con rol 'sub-adm'</p>";
    }
    
    echo "<br><p style='color: red;'><strong>IMPORTANTE:</strong> Elimina este archivo (fix_empty_roles.php) después de ejecutarlo por seguridad.</p>";
    
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    echo "<p style='color: red;'>Error: " . htmlspecialchars($e->getMessage()) . "</p>";
}
?>

