<?php
/**
 * Script de corrección forzada de roles
 * Verifica la estructura de la tabla y usa métodos alternativos
 */

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

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');
    }

    // Configurar PDO para mostrar errores
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "<h2>Corrección Forzada de Roles</h2>";
    
    // Verificar estructura de la tabla
    echo "<h3>Estructura de la tabla 'users':</h3>";
    try {
        $stmt = $pdo->query("DESCRIBE users");
        $columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo "<table border='1' cellpadding='5' style='border-collapse: collapse; margin-bottom: 20px;'>";
        echo "<tr><th>Campo</th><th>Tipo</th><th>Null</th><th>Key</th><th>Default</th><th>Extra</th></tr>";
        foreach ($columns as $col) {
            if ($col['Field'] === 'role') {
                echo "<tr style='background-color: #fff3cd;'>";
            } else {
                echo "<tr>";
            }
            echo "<td><strong>{$col['Field']}</strong></td>";
            echo "<td>{$col['Type']}</td>";
            echo "<td>{$col['Null']}</td>";
            echo "<td>{$col['Key']}</td>";
            echo "<td>" . ($col['Default'] ?? 'NULL') . "</td>";
            echo "<td>{$col['Extra']}</td>";
            echo "</tr>";
        }
        echo "</table>";
    } catch (Exception $e) {
        echo "<p style='color: red;'>Error al obtener estructura: " . htmlspecialchars($e->getMessage()) . "</p>";
    }
    
    // Obtener el usuario problemático
    $stmt = $pdo->query("SELECT id, username, role, ship_id FROM users WHERE username = 'Jonathan'");
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$user) {
        die("Usuario 'Jonathan' no encontrado");
    }
    
    echo "<h3>Usuario a corregir:</h3>";
    echo "<p>ID: {$user['id']}</p>";
    echo "<p>Usuario: {$user['username']}</p>";
    echo "<p>Rol actual: '" . var_export($user['role'], true) . "'</p>";
    echo "<p>Ship ID: {$user['ship_id']}</p>";
    
    // Determinar el nuevo rol
    $newRole = (!empty($user['ship_id']) && trim($user['ship_id']) !== '') ? 'sub-adm' : 'user';
    echo "<p><strong>Nuevo rol a asignar: '{$newRole}'</strong></p>";
    
    // Intentar diferentes métodos de actualización
    echo "<h3>Intentando actualizar...</h3>";
    
    $success = false;
    $methods = [
        "Método 1: UPDATE directo con PDO" => function() use ($pdo, $user, $newRole) {
            $stmt = $pdo->prepare("UPDATE users SET role = :role WHERE id = :id");
            return $stmt->execute([':role' => $newRole, ':id' => $user['id']]);
        },
        "Método 2: UPDATE con bindValue" => function() use ($pdo, $user, $newRole) {
            $stmt = $pdo->prepare("UPDATE users SET role = :role WHERE id = :id");
            $stmt->bindValue(':role', $newRole, PDO::PARAM_STR);
            $stmt->bindValue(':id', $user['id'], PDO::PARAM_INT);
            return $stmt->execute();
        },
        "Método 3: UPDATE con comillas simples en SQL" => function() use ($pdo, $user, $newRole) {
            $sql = "UPDATE users SET role = '{$newRole}' WHERE id = {$user['id']}";
            return $pdo->exec($sql);
        },
        "Método 4: UPDATE usando REPLACE" => function() use ($pdo, $user, $newRole) {
            $stmt = $pdo->prepare("UPDATE users SET role = REPLACE(COALESCE(role, ''), COALESCE(role, ''), :role) WHERE id = :id");
            return $stmt->execute([':role' => $newRole, ':id' => $user['id']]);
        },
        "Método 5: UPDATE con IFNULL" => function() use ($pdo, $user, $newRole) {
            $stmt = $pdo->prepare("UPDATE users SET role = :role WHERE id = :id AND (role IS NULL OR role = '' OR LENGTH(role) = 0)");
            return $stmt->execute([':role' => $newRole, ':id' => $user['id']]);
        }
    ];
    
    foreach ($methods as $methodName => $method) {
        echo "<p><strong>{$methodName}:</strong> ";
        try {
            $result = $method();
            $rowsAffected = is_bool($result) ? ($result ? 1 : 0) : $result;
            echo "Resultado: " . var_export($result, true) . ", Filas afectadas: {$rowsAffected}";
            
            // Verificar si se actualizó
            $verifyStmt = $pdo->prepare("SELECT role FROM users WHERE id = :id");
            $verifyStmt->execute([':id' => $user['id']]);
            $verified = $verifyStmt->fetch(PDO::FETCH_ASSOC);
            
            if ($verified && $verified['role'] === $newRole) {
                echo " <span style='color: green; font-weight: bold;'>✓ ÉXITO - Rol actualizado correctamente</span>";
                $success = true;
                break;
            } else {
                echo " <span style='color: orange;'>Rol verificado: '" . var_export($verified['role'] ?? null, true) . "'</span>";
            }
        } catch (Exception $e) {
            echo " <span style='color: red;'>Error: " . htmlspecialchars($e->getMessage()) . "</span>";
        }
        echo "</p>";
    }
    
    if (!$success) {
        echo "<h3 style='color: red;'>Ningún método funcionó. Intentando método directo con mysqli...</h3>";
        
        // Intentar con mysqli como último recurso
        // Detectar configuración desde config.php
        $isLocal = (
            php_sapi_name() === 'cli' ||
            (isset($_SERVER['HTTP_HOST']) && (
                $_SERVER['HTTP_HOST'] === 'localhost' ||
                $_SERVER['HTTP_HOST'] === '127.0.0.1' ||
                strpos($_SERVER['HTTP_HOST'], 'localhost:') === 0 ||
                strpos($_SERVER['HTTP_HOST'], '127.0.0.1:') === 0
            ))
        );
        
        if ($isLocal) {
            $dbHost = 'localhost';
            $dbName = 'buque_telemetria';
            $dbUser = 'root';
            $dbPass = '';
        } else {
            $dbHost = 'localhost';
            $dbName = 'devmaste_buque_pruebas';
            $dbUser = 'devmaste_buque_pruebas_user';
            $dbPass = 'todotulio215';
        }
        
        $mysqli = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
        if (!$mysqli->connect_error) {
            $newRoleEscaped = $mysqli->real_escape_string($newRole);
            $sql = "UPDATE users SET role = '{$newRoleEscaped}' WHERE id = {$user['id']}";
            $result = $mysqli->query($sql);
            
            if ($result) {
                echo "<p style='color: green;'>✓ Actualizado con mysqli. Filas afectadas: " . $mysqli->affected_rows . "</p>";
                $success = true;
            } else {
                echo "<p style='color: red;'>Error mysqli: " . $mysqli->error . "</p>";
            }
            $mysqli->close();
        } else {
            echo "<p style='color: red;'>Error de conexión mysqli: " . $mysqli->connect_error . "</p>";
        }
    }
    
    // Verificar estado final
    echo "<h3>Estado final:</h3>";
    $stmt = $pdo->query("SELECT id, username, role, ship_id FROM users ORDER BY id");
    $finalUsers = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    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></tr>";
    foreach ($finalUsers as $u) {
        $bgColor = ($u['role'] === $newRole && $u['id'] == $user['id']) ? 'background-color: #d4edda;' : '';
        echo "<tr style='{$bgColor}'>";
        echo "<td>{$u['id']}</td>";
        echo "<td><strong>{$u['username']}</strong></td>";
        echo "<td>" . var_export($u['role'], true) . "</td>";
        echo "<td>" . ($u['ship_id'] ?? 'NULL') . "</td>";
        echo "</tr>";
    }
    echo "</table>";
    
    if ($success) {
        echo "<p style='color: green; font-size: 18px;'><strong>✓ Rol actualizado correctamente</strong></p>";
    } else {
        echo "<p style='color: red; font-size: 18px;'><strong>✗ No se pudo actualizar el rol. Puede haber una restricción en la base de datos.</strong></p>";
        echo "<p>Intenta actualizar manualmente desde phpMyAdmin con: <code>UPDATE users SET role = '{$newRole}' WHERE id = {$user['id']};</code></p>";
    }
    
    echo "<br><p style='color: red;'><strong>IMPORTANTE:</strong> Elimina este archivo después de ejecutarlo.</p>";
    
} catch (Exception $e) {
    echo "<p style='color: red;'>Error: " . htmlspecialchars($e->getMessage()) . "</p>";
    if (isset($pdo)) {
        echo "<p>Error Info: " . json_encode($pdo->errorInfo()) . "</p>";
    }
}
?>

