<?php
session_start();
if (!isset($_SESSION['usuario'])) {
    header("Location: index.php");
    exit();
}

include 'conexion.php';

$backup_dir = 'backups/';
if (!is_dir($backup_dir)) {
    mkdir($backup_dir, 0777, true);
}

$message = '';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $action = $_POST['action'] ?? '';
    $table = $_POST['table'] ?? '';

    if (!in_array($table, ['usuario', 'inversionista', 'inversion', 'saldo'])) {
        $message = "<p style='color:red;'>❌ Tabla no válida.</p>";
    } else {
        $backup_file = $backup_dir . $table . '.sql';

        if ($action == 'backup') {
            // Obtener estructura
            $sql_create = "SHOW CREATE TABLE `$table`";
            $result = $conn->query($sql_create);
            if (!$result || !$row = $result->fetch_row()) {
                $message = "<p style='color:red;'>❌ Error al obtener estructura de '$table'.</p>";
                goto end;
            }

            $create_statement = $row[1] . ";\n\n";

            // Obtener datos
            $data = $conn->query("SELECT * FROM `$table`");
            $insert_statements = "";
            if ($data->num_rows > 0) {
                while ($row_data = $data->fetch_assoc()) {
                    $keys = array_keys($row_data);
                    $values = array_map([$conn, 'real_escape_string'], array_values($row_data));
                    $values = array_map(function($v) { return "'$v'"; }, $values);
                    $insert_statements .= "INSERT INTO `$table` (`" . implode("`,`", $keys) . "`) VALUES (" . implode(",", $values) . ");\n";
                }
            }

            // Guardar
            $content = "-- Respaldo completo de '$table'\n";
            $content .= "-- Fecha: " . date('Y-m-d H:i:s') . "\n\n";
            $content .= $create_statement;
            $content .= $insert_statements;

            file_put_contents($backup_file, $content);
            $message = "<p style='color:green;'>✅ Respaldo COMPLETO de '$table' guardado.</p>";

        } elseif ($action == 'restore') {

            if (!file_exists($backup_file)) {
                $message = "<p style='color:red;'>❌ No existe respaldo para '$table'.</p>";
            } else {
                $sql_content = file_get_contents($backup_file);

                $conn->query("SET FOREIGN_KEY_CHECKS=0");
                $conn->query("DROP TABLE IF EXISTS `$table`");

                $errors = [];

                // ✅ EJECUTAR TODO EL ARCHIVO CON multi_query
                if ($conn->multi_query($sql_content)) {
                    do {
                        if ($result = $conn->store_result()) {
                            $result->free();
                        }
                    } while ($conn->next_result());
                }

                if ($conn->errno) {
                    $errors[] = "❌ Error MySQL: " . $conn->error;
                }

                // Verificar que la tabla se creó
                $check = $conn->query("SHOW TABLES LIKE '$table'");
                if (!$check || $check->num_rows === 0) {
                    $errors[] = "❌ ¡La tabla '$table' no se creó!";
                }

                $conn->query("SET FOREIGN_KEY_CHECKS=1");

                if (empty($errors)) {
                    $message = "<p style='color:blue;'>✅ Tabla '$table' RESTAURADA completamente.</p>";
                } else {
                    $message = "<p style='color:red;'>⚠️ Errores:<br>" . implode('<br><br>', $errors) . "</p>";
                }
            }
        }elseif ($action == 'download') {
            if (!in_array($table, ['usuario', 'inversionista', 'inversion', 'saldo'])) {
                $message = "<p style='color:red;'>❌ Tabla no válida para descargar.</p>";
                goto end;
            }

            // Generar contenido SQL (igual que en backup)
            $sql_create = "SHOW CREATE TABLE `$table`";
            $result = $conn->query($sql_create);
            if (!$result || !$row = $result->fetch_row()) {
                $message = "<p style='color:red;'>❌ Error al obtener estructura de '$table' para descargar.</p>";
                goto end;
            }

            $create_statement = $row[1] . ";\n\n";

            $data = $conn->query("SELECT * FROM `$table`");
            $insert_statements = "";
            if ($data->num_rows > 0) {
                while ($row_data = $data->fetch_assoc()) {
                    $keys = array_keys($row_data);
                    $values = array_map([$conn, 'real_escape_string'], array_values($row_data));
                    $values = array_map(function($v) { return "'$v'"; }, $values);
                    $insert_statements .= "INSERT INTO `$table` (`" . implode("`,`", $keys) . "`) VALUES (" . implode(",", $values) . ");\n";
                }
            }

            $content = "-- Respaldo descargable de '$table'\n";
            $content .= "-- Fecha: " . date('Y-m-d H:i:s') . "\n\n";
            $content .= $create_statement;
            $content .= $insert_statements;

            // Forzar descarga
            header('Content-Type: application/sql');
            header('Content-Disposition: attachment; filename="' . $table . '_' . date('Ymd_His') . '.sql"');
            header('Content-Length: ' . strlen($content));
            echo $content;
            exit; // ¡Importante! Detener la ejecución para que solo se descargue el archivo.
        }elseif ($action == 'upload_restore') {
            if (!in_array($table, ['usuario', 'inversionista', 'inversion', 'saldo'])) {
                $message = "<p style='color:red;'>❌ Tabla no válida para restaurar.</p>";
                goto end;
            }

            if (!isset($_FILES['sql_file']) || $_FILES['sql_file']['error'] !== UPLOAD_ERR_OK) {
                $message = "<p style='color:red;'>❌ No se seleccionó ningún archivo o hubo un error en la subida.</p>";
                goto end;
            }

            $file_name = $_FILES['sql_file']['name'];
            $file_tmp = $_FILES['sql_file']['tmp_name'];
            $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));

            if ($file_ext !== 'sql') {
                $message = "<p style='color:red;'>❌ Solo se permiten archivos con extensión .sql</p>";
                goto end;
            }

            $sql_content = file_get_contents($file_tmp);
            if ($sql_content === false) {
                $message = "<p style='color:red;'>❌ Error al leer el archivo subido.</p>";
                goto end;
            }

            // Opcional: Validar que el archivo contiene la tabla correcta (básico)
            if (strpos($sql_content, "CREATE TABLE `$table`") === false && strpos($sql_content, "INSERT INTO `$table`") === false) {
                $message = "<p style='color:orange;'>⚠️ El archivo podría no corresponder a la tabla '$table'. ¿Continuar igual?</p>";
                // Puedes detener aquí o permitir continuar. Para permitir, quita el goto.
                // goto end; // ← descomenta si quieres bloquear archivos no coincidentes
            }

            // Ejecutar restauración
            $conn->query("SET FOREIGN_KEY_CHECKS=0");
            $conn->query("DROP TABLE IF EXISTS `$table`");

            $errors = [];

            if ($conn->multi_query($sql_content)) {
                do {
                    if ($result = $conn->store_result()) {
                        $result->free();
                    }
                } while ($conn->next_result());
            }

            if ($conn->errno) {
                $errors[] = "❌ Error MySQL: " . $conn->error;
            }

            $check = $conn->query("SHOW TABLES LIKE '$table'");
            if (!$check || $check->num_rows === 0) {
                $errors[] = "❌ ¡La tabla '$table' no se creó!";
            }

            $conn->query("SET FOREIGN_KEY_CHECKS=1");

            if (empty($errors)) {
                $message = "<p style='color:blue;'>✅ Tabla '$table' RESTAURADA desde archivo subido.</p>";
            } else {
                $message = "<p style='color:red;'>⚠️ Errores:<br>" . implode('<br><br>', $errors) . "</p>";
            }
        }
    }
}
end:
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Respaldar Base de Datos</title>
    <link rel="stylesheet" href="style.css">
    <style>
        body {
            padding: 20px;
            background-color: #f5f5f7;
        }
        .menu-superior {
            background-color: #1D1D1F;
            padding: 10px;
            margin-bottom: 20px;
            border-radius: 5px;
        }
        .menu-superior a {
            color: white;
            text-decoration: none;
            margin-right: 15px;
            font-size: 16px;
        }
        .menu-superior a:hover {
            text-decoration: underline;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
            background: white;
            box-shadow: 0 0 10px rgba(0,0,0,0.05);
            border-radius: 5px;
            overflow: hidden;
        }
        th, td {
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }
        th {
            background-color: #f4f4f4;
            font-weight: bold;
        }
        .acciones .btn {
            margin: 2px;
            padding: 6px 12px;
            font-size: 14px;
        }
        .message {
            margin: 20px 0;
            padding: 15px;
            border-radius: 5px;
            background: #f8f9fa;
            border-left: 4px solid #007AFF;
        }
        .message p {
            margin: 0;
        }
    </style>
</head>
<body>

    <div class="menu-superior">
        <a href="inicio_moderno.php">Inicio</a>
        <a href="index.php">Cerrar Sesión</a>
    </div>

    <h2>Respaldar y Restaurar Base de Datos (Estructura + Datos)</h2>

    <?php if ($message): ?>
        <div class="message"><?= $message ?></div>
    <?php endif; ?>

    <table>
        <thead>
            <tr>
                <th>Tablas</th>
                <th>Acciones</th>
            </tr>
        </thead>
        <tbody>
            <?php
            $tables = ['usuario', 'inversionista', 'inversion'];
            foreach ($tables as $table):
            ?>
            <tr>
                <td><?= htmlspecialchars($table) ?></td>
                <td class="acciones">
                    <form method="POST" style="display:inline;">
                        <input type="hidden" name="table" value="<?= $table ?>">
                        <input type="hidden" name="action" value="backup">
                        <button type="submit" class="btn">Respaldar</button>
                    </form>
                    <form method="POST" style="display:inline;">
                        <input type="hidden" name="table" value="<?= $table ?>">
                        <input type="hidden" name="action" value="restore">
                        <button type="submit" class="btn" style="background-color:#dc3545;" onclick="return confirm('⚠️ ¡Se ELIMINARÁ y RECREARÁ la tabla con los datos del respaldo! ¿Continuar?')">Restaurar</button>
                    </form>
                    <form method="POST" style="display:inline;">
                        <input type="hidden" name="table" value="<?= $table ?>">
                        <input type="hidden" name="action" value="download">
                        <button type="submit" class="btn" style="background-color:#28a745;">Descargar</button>
                    </form>
                    <form method="POST" enctype="multipart/form-data" style="display:inline;">
                        <input type="hidden" name="table" value="<?= $table ?>">
                        <input type="hidden" name="action" value="upload_restore">
                        <input type="file" name="sql_file" accept=".sql" style="display:none;" id="file_<?= $table ?>" onchange="this.form.submit()">
                        <button type="button" class="btn" style="background-color:#6f42c1;" onclick="document.getElementById('file_<?= $table ?>').click()">Cargar</button>
                    </form>
                </td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>

</body>
</html>