<?php



if(isset($_POST["sfeccha"])){
   echo date('Y-m-d H:i:s');


}
if(isset($_GET["resp"])){
   if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }

   $respuesta=$_GET["resp"];
   $archivo = fopen('mensajeError.txt', 'a');

   fwrite($archivo, $respuesta. $_SESSION["nonombre"] . PHP_EOL);
   fclose($archivo);





}else if(isset($_GET["actualiz"])){
    






/**
 * Script de actualización de base de datos
 * Ejecuta sentencias SQL desde actualizaciones.sql de forma segura
 */

include("../conexion/conexion.php");

$archivo = __DIR__ . "/actualizaciones.sql";

// Verificar existencia del archivo
if (!file_exists($archivo)) {
    die("❌ Archivo de actualizaciones no encontrado: $archivo");
}

// Leer y procesar sentencias
$contenido = file_get_contents($archivo);
$sentencias = array_filter(
    array_map('trim', explode(";", $contenido)),
    function($sql) { return !empty($sql); }
);

// Contadores
$ok = 0;
$skip = 0;
$fail = 0;
$errores = [];

// Conexión a BD
$connn = new conexion();
$mysqli = $connn->conectar();

if ($mysqli->connect_error) {
    die("❌ Error de conexión: " . $mysqli->connect_error);
}

// Configurar charset
$mysqli->set_charset("utf8mb4");

foreach ($sentencias as $index => $sql) {
    $numeroLinea = $index + 1;
    
    try {
        // ✅ Validar CREATE TABLE
        if (stripos($sql, "CREATE TABLE") !== false) {
            if (preg_match('/CREATE TABLE\s+`?(\w+)`?/i', $sql, $match)) {
                $tabla = $match[1];
                
                $res = $mysqli->query("SHOW TABLES LIKE '$tabla'");
                
                if ($res && $res->num_rows > 0) {
                    $skip++;
                    echo "⏩ Línea $numeroLinea: Tabla '$tabla' ya existe<br>";
                    continue;
                }
                
                // Agregar IF NOT EXISTS si no está presente
                if (stripos($sql, "IF NOT EXISTS") === false) {
                    $sql = preg_replace("/CREATE TABLE\s+/i", "CREATE TABLE IF NOT EXISTS ", $sql, 1);
                }
            }
        }

        // ✅ Validar ALTER TABLE ADD COLUMN
        if (stripos($sql, "ALTER TABLE") !== false && stripos($sql, "ADD") !== false) {
            if (preg_match('/ALTER TABLE\s+`?(\w+)`?.*ADD\s+(?:COLUMN\s+)?`?(\w+)`?/i', $sql, $m)) {
                $tabla = $m[1];
                $columna = $m[2];

                $res = $mysqli->query("SHOW COLUMNS FROM `$tabla` LIKE '$columna'");
                
                if ($res && $res->num_rows > 0) {
                    $skip++;
                    echo "⏩ Línea $numeroLinea: Columna '$columna' ya existe en tabla '$tabla'<br>";
                    continue;
                }
            }
        }

        // ✅ Validar ALTER TABLE ADD INDEX
        if (stripos($sql, "ALTER TABLE") !== false && 
            (stripos($sql, "ADD INDEX") !== false || stripos($sql, "ADD KEY") !== false)) {
            if (preg_match('/ALTER TABLE\s+`?(\w+)`?.*ADD\s+(?:INDEX|KEY)\s+`?(\w+)`?/i', $sql, $m)) {
                $tabla = $m[1];
                $indice = $m[2];

                $res = $mysqli->query("SHOW INDEX FROM `$tabla` WHERE Key_name = '$indice'");
                
                if ($res && $res->num_rows > 0) {
                    $skip++;
                    echo "⏩ Línea $numeroLinea: Índice '$indice' ya existe en tabla '$tabla'<br>";
                    continue;
                }
            }
        }

        // ✅ Validar ALTER TABLE ADD CONSTRAINT (Foreign Keys)
        if (stripos($sql, "ALTER TABLE") !== false && stripos($sql, "ADD CONSTRAINT") !== false) {
            if (preg_match('/ALTER TABLE\s+`?(\w+)`?.*ADD CONSTRAINT\s+`?(\w+)`?/i', $sql, $m)) {
                $tabla = $m[1];
                $llave = $m[2];

                $database = $mysqli->query("SELECT DATABASE()")->fetch_row()[0];
                $res = $mysqli->query(
                    "SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                     WHERE TABLE_SCHEMA = '$database' 
                     AND TABLE_NAME = '$tabla' 
                     AND CONSTRAINT_NAME = '$llave'"
                );
                
                if ($res && $res->num_rows > 0) {
                    $skip++;
                    echo "⏩ Línea $numeroLinea: Constraint '$llave' ya existe en tabla '$tabla'<br>";
                    continue;
                }
            }
        }

        // ✅ Validar INSERT
        if (stripos($sql, "INSERT INTO") !== false) {
            // Regex mejorado para capturar correctamente columnas y valores
            if (preg_match('/INSERT\s+INTO\s+`?(\w+)`?\s*\(([^)]+)\)\s*VALUES?\s*\(([^)]+)\)/is', $sql, $m)) {
                $tabla = $m[1];
                $columnasRaw = $m[2];
                $valores = $m[3];
                
                // Limpiar nombres de columnas (quitar backticks y espacios)
                $columnas = array_map(function($col) {
                    return trim(str_replace(['`', ' '], '', $col));
                }, explode(',', $columnasRaw));
                
                // Extraer valores y limpiar
                $valoresArray = preg_split('/,(?=(?:[^\'"]|[\'"][^\'"]*[\'"])*$)/', $valores);
                $valoresArray = array_map('trim', $valoresArray);
                
                // Buscar columna única o primaria
                $database = $mysqli->query("SELECT DATABASE()")->fetch_row()[0];
                $res = $mysqli->query(
                    "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS 
                     WHERE TABLE_SCHEMA = '$database' 
                     AND TABLE_NAME = '$tabla' 
                     AND COLUMN_KEY IN ('PRI', 'UNI')
                     ORDER BY COLUMN_KEY DESC"
                );
                
                $columnasUnicas = [];
                if ($res) {
                    while ($row = $res->fetch_assoc()) {
                        $columnasUnicas[] = $row['COLUMN_NAME'];
                    }
                }
                
                // Estrategia 1: Usar columna única/primaria que NO sea NULL o autoincremental
                $registroExiste = false;
                foreach ($columnasUnicas as $columnaUnica) {
                    $indiceColumna = array_search($columnaUnica, $columnas);
                    
                    if ($indiceColumna !== false && isset($valoresArray[$indiceColumna])) {
                        $valorBuscar = trim($valoresArray[$indiceColumna], "' \"");
                        
                        // Ignorar si es NULL o vacío (probablemente autoincremental)
                        if (strtoupper($valorBuscar) === 'NULL' || $valorBuscar === '') {
                            continue;
                        }
                        
                        $valorBuscar = $mysqli->real_escape_string($valorBuscar);
                        
                        // Verificar si ya existe
                        $checkRes = $mysqli->query("SELECT 1 FROM `$tabla` WHERE `$columnaUnica` = '$valorBuscar' LIMIT 1");
                        
                        if ($checkRes && $checkRes->num_rows > 0) {
                            $registroExiste = true;
                            $skip++;
                            echo "⏩ Línea $numeroLinea: Registro ya existe en '$tabla' ($columnaUnica = '$valorBuscar')<br>";
                            break;
                        }
                    }
                }
                
                if ($registroExiste) {
                    continue;
                }
                
                // Estrategia 2: Si no hay clave única válida, buscar por combinación de columnas significativas
                // (excluyendo id, NULL y campos autoincrementales)
                if (!$registroExiste) {
                    $whereParts = [];
                    
                    for ($i = 0; $i < count($columnas); $i++) {
                        $columna = $columnas[$i];
                        
                        // Ignorar columnas típicamente autoincrementales o no significativas
                        if (in_array(strtolower($columna), ['id', 'idd', 'created_at', 'updated_at', 'fecha_creacion', 'fecha_modificacion'])) {
                            continue;
                        }
                        
                        if (isset($valoresArray[$i])) {
                            $valor = trim($valoresArray[$i], "' \"");
                            
                            // Ignorar NULLs
                            if (strtoupper($valor) === 'NULL' || $valor === '') {
                                continue;
                            }
                            
                            $valor = $mysqli->real_escape_string($valor);
                            $whereParts[] = "`$columna` = '$valor'";
                        }
                    }
                    
                    // Si encontramos columnas para comparar
                    if (count($whereParts) > 0) {
                        $whereClause = implode(' AND ', $whereParts);
                        $checkRes = $mysqli->query("SELECT 1 FROM `$tabla` WHERE $whereClause LIMIT 1");
                        
                        if ($mysqli->error) {
                            echo "⚠️ Línea $numeroLinea: Error en verificación - " . $mysqli->error . "<br>";
                        } else if ($checkRes && $checkRes->num_rows > 0) {
                            $skip++;
                            echo "⏩ Línea $numeroLinea: Registro ya existe en '$tabla' (combinación de valores)<br>";
                            continue;
                        }
                    }
                }
            }
        }

        // ✅ Validar UPDATE
        if (stripos($sql, "UPDATE") !== false && stripos($sql, "SET") !== false) {
            if (preg_match('/UPDATE\s+`?(\w+)`?\s+SET\s+(.*?)\s+WHERE\s+(.*?)$/is', $sql, $m)) {
                $tabla = $m[1];
                $setClause = $m[2];
                $whereClause = $m[3];
                
                // Verificar si el registro existe
                $checkSql = "SELECT * FROM `$tabla` WHERE $whereClause LIMIT 1";
                $resultado = $mysqli->query($checkSql);
                
                if ($resultado && $resultado->num_rows > 0) {
                    $registroActual = $resultado->fetch_assoc();
                    
                    // Parsear los SET values
                    preg_match_all('/`?(\w+)`?\s*=\s*([^,]+)/i', $setClause, $matches, PREG_SET_ORDER);
                    
                    $necesitaActualizar = false;
                    foreach ($matches as $match) {
                        $columna = trim($match[1]);
                        $nuevoValor = trim($match[2], "' \"");
                        
                        // Manejar funciones SQL como NOW(), NULL, etc.
                        if (strtoupper($nuevoValor) === 'NOW()' || strtoupper($nuevoValor) === 'NULL') {
                            $necesitaActualizar = true;
                            break;
                        }
                        
                        if (isset($registroActual[$columna])) {
                            $valorActual = $registroActual[$columna];
                            
                            // Comparar valores
                            if (strval($valorActual) !== strval($nuevoValor)) {
                                $necesitaActualizar = true;
                                break;
                            }
                        } else {
                            // Columna no existe en el resultado, probablemente necesita actualizar
                            $necesitaActualizar = true;
                            break;
                        }
                    }
                    
                    if (!$necesitaActualizar) {
                        $skip++;
                        echo "⏩ Línea $numeroLinea: UPDATE omitido - registro en '$tabla' ya tiene los valores correctos<br>";
                        continue;
                    }
                } else if ($resultado && $resultado->num_rows == 0) {
                    echo "⚠️ Línea $numeroLinea: UPDATE no encontró registros en '$tabla' con la condición WHERE<br>";
                }
            }
        }

        // ✅ Validar DROP TABLE (advertencia)
        if (stripos($sql, "DROP TABLE") !== false) {
            echo "⚠️ Línea $numeroLinea: Se detectó DROP TABLE - ejecutando con precaución<br>";
        }

        // ✅ Ejecutar sentencia
        $resultado = $mysqli->query($sql);

        if ($resultado === false) {
            $fail++;
            $error = "Línea $numeroLinea: " . $mysqli->error;
            $errores[] = $error;
            echo "❌ $error<br>";
        } else {
            $ok++;
            echo "✅ Línea $numeroLinea: Sentencia ejecutada correctamente<br>";
        }

    } catch (Exception $e) {
        $fail++;
        $error = "Línea $numeroLinea - Excepción: " . $e->getMessage();
        $errores[] = $error;
        echo "⚠️ $error<br>";
    }
}

// Cerrar conexión
$mysqli->close();

// Resumen final
echo "<hr>";
echo "<h3>📊 Resumen de Ejecución</h3>";
echo "✅ <strong>$ok</strong> sentencias aplicadas correctamente<br>";
echo "⏩ <strong>$skip</strong> sentencias omitidas (ya existían)<br>";
echo "❌ <strong>$fail</strong> sentencias con errores<br>";
echo "<strong>Total procesadas:</strong> " . count($sentencias) . "<br>";

if (!empty($errores)) {
    echo "<hr>";
    echo "<h3>⚠️ Detalle de Errores</h3>";
    echo "<ul>";
    foreach ($errores as $error) {
        echo "<li>$error</li>";
    }
    echo "</ul>";
}

echo "<hr>";
echo "<p>✓ Proceso finalizado</p>";










}






?>