<?php
session_start();
if (!isset($_SESSION['usuario']) || !isset($_SESSION['token'])) {
    die("Acceso no autorizado");
}

require 'conexion.php';

// ✅ HABILITAR LOGGING DE ERRORES
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/upload_errors.log');

$accion = $_POST['accion'] ?? '';

// ✅ FUNCIÓN PARA SUBIR IMÁGENES (SIN FINFO - COMPATIBLE)
function subirImagen($inputName, $carpetaDestino = 'img_preguntas/') {
    // Verificar que existe el archivo
    if (!isset($_FILES[$inputName]) || $_FILES[$inputName]['error'] === UPLOAD_ERR_NO_FILE) {
        return null; // No se subió archivo
    }
    
    $archivo = $_FILES[$inputName];
    
    // ✅ DEBUGGING: Registrar información del archivo
    error_log("Intentando subir: $inputName");
    error_log("Nombre: " . $archivo['name']);
    error_log("Tamaño: " . $archivo['size'] . " bytes");
    error_log("Tipo: " . $archivo['type']);
    error_log("Error: " . $archivo['error']);
    
    // Validar errores de subida con mensajes detallados
    switch ($archivo['error']) {
        case UPLOAD_ERR_OK:
            break;
        case UPLOAD_ERR_INI_SIZE:
            throw new Exception("El archivo excede el tamaño máximo permitido por PHP (upload_max_filesize)");
        case UPLOAD_ERR_FORM_SIZE:
            throw new Exception("El archivo excede el tamaño máximo permitido por el formulario");
        case UPLOAD_ERR_PARTIAL:
            throw new Exception("El archivo se subió parcialmente. Intente nuevamente");
        case UPLOAD_ERR_NO_TMP_DIR:
            throw new Exception("Falta la carpeta temporal en el servidor");
        case UPLOAD_ERR_CANT_WRITE:
            throw new Exception("Error al escribir el archivo en disco");
        case UPLOAD_ERR_EXTENSION:
            throw new Exception("Una extensión de PHP detuvo la subida del archivo");
        default:
            throw new Exception("Error desconocido al subir archivo. Código: " . $archivo['error']);
    }
    
    // ✅ VALIDACIÓN DE TIPO SIN FILEINFO (método alternativo más compatible)
    $extensionesPermitidas = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'];
    $extension = strtolower(pathinfo($archivo['name'], PATHINFO_EXTENSION));
    
    if (!in_array($extension, $extensionesPermitidas)) {
        throw new Exception("Extensión de archivo no permitida ($extension). Solo se permiten: JPG, JPEG, PNG, GIF, WEBP, SVG.");
    }
    
    // Validación adicional por tipo MIME del navegador
    $tiposPermitidos = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'];
    if (!in_array($archivo['type'], $tiposPermitidos)) {
        throw new Exception("Tipo de archivo no permitido ({$archivo['type']}). Solo se permiten imágenes.");
    }
    
    error_log("Extensión detectada: $extension");
    error_log("MIME Type reportado: {$archivo['type']}");
    
    // ✅ Validar tamaño (5MB máximo)
    $maxSize = 5 * 1024 * 1024; // 5MB en bytes
    if ($archivo['size'] > $maxSize) {
        throw new Exception("La imagen es demasiado grande (" . round($archivo['size']/1024/1024, 2) . "MB). Tamaño máximo: 5MB");
    }
    
    // Validar que el archivo temporal existe
    if (!file_exists($archivo['tmp_name'])) {
        throw new Exception("El archivo temporal no existe. Problema con la configuración del servidor.");
    }
    
    // Crear carpeta si no existe
    if (!file_exists($carpetaDestino)) {
        error_log("Creando carpeta: $carpetaDestino");
        if (!mkdir($carpetaDestino, 0755, true)) {
            throw new Exception("No se pudo crear la carpeta '$carpetaDestino'. Verifica los permisos.");
        }
    }
    
    // Verificar permisos de escritura
    if (!is_writable($carpetaDestino)) {
        throw new Exception("La carpeta '$carpetaDestino' no tiene permisos de escritura (755 requerido).");
    }
    
    // Generar nombre único para el archivo
    $nombreUnico = uniqid('img_', true) . '.' . $extension;
    $rutaCompleta = $carpetaDestino . $nombreUnico;
    
    error_log("Intentando guardar en: $rutaCompleta");
    
    // Mover archivo a la carpeta de destino
    if (!move_uploaded_file($archivo['tmp_name'], $rutaCompleta)) {
        throw new Exception("Error al mover archivo de '{$archivo['tmp_name']}' a '$rutaCompleta'");
    }
    
    error_log("✅ Archivo guardado exitosamente: $rutaCompleta");
    
    return $rutaCompleta;
}

// ✅ FUNCIÓN PARA ELIMINAR IMAGEN DEL SERVIDOR
function eliminarImagenAnterior($rutaImagen) {
    if ($rutaImagen && $rutaImagen !== '' && file_exists($rutaImagen)) {
        if (@unlink($rutaImagen)) {
            error_log("✅ Imagen eliminada: $rutaImagen");
        } else {
            error_log("⚠️ No se pudo eliminar: $rutaImagen");
        }
    }
}

// ✅ VERIFICAR LÍMITES DE PHP AL INICIO
$maxUpload = ini_get('upload_max_filesize');
$maxPost = ini_get('post_max_size');
error_log("Límites PHP - upload_max_filesize: $maxUpload, post_max_size: $maxPost");

switch ($accion) {
    case 'registrar':
        try {
            $materia_id = $_POST['materia_id'] ?? '';
            $pregunta = $_POST['pregunta'] ?? '';
            $pregunta_a = $_POST['pregunta_a'] ?? '';
            $pregunta_b = $_POST['pregunta_b'] ?? '';
            $opcion1 = $_POST['opcion1'] ?? '';
            $opcion2 = $_POST['opcion2'] ?? '';
            $opcion3 = $_POST['opcion3'] ?? '';
            $opcion4 = $_POST['opcion4'] ?? '';
            $opcion5 = $_POST['opcion5'] ?? '';
            $correcta_rpta = $_POST['correcta_rpta'] ?? '';
            $detalle_rpta = $_POST['detalle_rpta'] ?? '';
        
            // Validaciones
            if (empty($pregunta) || empty($opcion1) || empty($opcion2) || empty($opcion3)) {
                exit("La pregunta principal y las primeras 3 opciones son obligatorias.");
            }
            
            if (empty($materia_id)) {
                exit("Debe seleccionar una materia.");
            }
            
            // Verificar que el código de materia existe
            $checkMateria = $conn->prepare("SELECT cod_materia FROM Materias WHERE cod_materia = ?");
            $checkMateria->bind_param("s", $materia_id);
            $checkMateria->execute();
            if ($checkMateria->get_result()->num_rows === 0) {
                exit("El código de materia '$materia_id' no existe.");
            }
            
            if ($correcta_rpta < 1 || $correcta_rpta > 5) {
                exit("La respuesta correcta no es válida.");
            }
            
            // Validar que la respuesta correcta corresponda a una opción que existe
            if ($correcta_rpta == 4 && empty($opcion4)) {
                exit("No se puede seleccionar la Opción 4 como correcta si está vacía.");
            }
            
            if ($correcta_rpta == 5 && empty($opcion5)) {
                exit("No se puede seleccionar la Opción 5 como correcta si está vacía.");
            }
            
            error_log("=== INICIANDO SUBIDA DE IMÁGENES ===");
            
            // ✅ SUBIR IMÁGENES (si existen)
            $imagen_pregunta = subirImagen('file_pregunta');
            $imagen_pregunta_a = subirImagen('file_pregunta_a');
            $imagen_pregunta_b = subirImagen('file_pregunta_b');
            
            error_log("=== IMÁGENES SUBIDAS CORRECTAMENTE ===");
        
            $stmt = $conn->prepare("INSERT INTO Preguntas (materia_id, pregunta, imagen_pregunta, pregunta_a, imagen_pregunta_a, pregunta_b, imagen_pregunta_b, opcion1, opcion2, opcion3, opcion4, opcion5, correcta_rpta, detalle_rpta) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
            
            if (!$stmt) {
                throw new Exception("Error al preparar la consulta: " . $conn->error);
            }
            
            $stmt->bind_param("ssssssssssssss", $materia_id, $pregunta, $imagen_pregunta, $pregunta_a, $imagen_pregunta_a, $pregunta_b, $imagen_pregunta_b, $opcion1, $opcion2, $opcion3, $opcion4, $opcion5, $correcta_rpta, $detalle_rpta);
        
            if ($stmt->execute()) {
                echo "Pregunta registrada correctamente.";
                error_log("✅ Pregunta registrada con ID: " . $stmt->insert_id);
            } else {
                // Si falla, eliminar imágenes subidas
                eliminarImagenAnterior($imagen_pregunta);
                eliminarImagenAnterior($imagen_pregunta_a);
                eliminarImagenAnterior($imagen_pregunta_b);
                throw new Exception("Error al guardar en BD: " . $stmt->error);
            }
        } catch (Exception $e) {
            error_log("❌ ERROR en registrar: " . $e->getMessage());
            echo "Error: " . $e->getMessage();
        }
        break;

    case 'actualizar':
        try {
            $id = $_POST['id'] ?? '';
            $materia_id = $_POST['materia_id'] ?? '';
            $pregunta = $_POST['pregunta'] ?? '';
            $pregunta_a = $_POST['pregunta_a'] ?? '';
            $pregunta_b = $_POST['pregunta_b'] ?? '';
            $opcion1 = $_POST['opcion1'] ?? '';
            $opcion2 = $_POST['opcion2'] ?? '';
            $opcion3 = $_POST['opcion3'] ?? '';
            $opcion4 = $_POST['opcion4'] ?? '';
            $opcion5 = $_POST['opcion5'] ?? '';
            $correcta_rpta = $_POST['correcta_rpta'] ?? '';
            $detalle_rpta = $_POST['detalle_rpta'] ?? '';

            // Validaciones
            if (empty($id)) {
                exit("ID de pregunta no válido.");
            }
            
            if (empty($pregunta) || empty($opcion1) || empty($opcion2) || empty($opcion3)) {
                exit("La pregunta principal y las primeras 3 opciones son obligatorias.");
            }
            
            if (empty($materia_id)) {
                exit("Debe seleccionar una materia.");
            }
            
            // Verificar que el código de materia existe
            $checkMateria = $conn->prepare("SELECT cod_materia FROM Materias WHERE cod_materia = ?");
            $checkMateria->bind_param("s", $materia_id);
            $checkMateria->execute();
            if ($checkMateria->get_result()->num_rows === 0) {
                exit("El código de materia '$materia_id' no existe.");
            }
            
            if ($correcta_rpta < 1 || $correcta_rpta > 5) {
                exit("La respuesta correcta no es válida.");
            }
            
            // Validar que la respuesta correcta corresponda a una opción que existe
            if ($correcta_rpta == 4 && empty($opcion4)) {
                exit("No se puede seleccionar la Opción 4 como correcta si está vacía.");
            }
            
            if ($correcta_rpta == 5 && empty($opcion5)) {
                exit("No se puede seleccionar la Opción 5 como correcta si está vacía.");
            }

            // ✅ OBTENER RUTAS DE IMÁGENES ACTUALES
            $stmtActual = $conn->prepare("SELECT imagen_pregunta, imagen_pregunta_a, imagen_pregunta_b FROM Preguntas WHERE Id = ?");
            $stmtActual->bind_param("i", $id);
            $stmtActual->execute();
            $resultado = $stmtActual->get_result();
            
            if ($resultado->num_rows === 0) {
                exit("La pregunta con ID $id no existe.");
            }
            
            $imagenActual = $resultado->fetch_assoc();
            
            // ✅ PROCESAR IMÁGENES
            $imagen_pregunta = $imagenActual['imagen_pregunta'] ?? '';
            $imagen_pregunta_a = $imagenActual['imagen_pregunta_a'] ?? '';
            $imagen_pregunta_b = $imagenActual['imagen_pregunta_b'] ?? '';
            
            error_log("=== ACTUALIZANDO - Procesando imágenes ===");
            error_log("📥 POST imagen_pregunta_eliminar: " . ($_POST['imagen_pregunta_eliminar'] ?? 'NO RECIBIDO'));
            error_log("📥 POST imagen_pregunta_a_eliminar: " . ($_POST['imagen_pregunta_a_eliminar'] ?? 'NO RECIBIDO'));
            error_log("📥 POST imagen_pregunta_b_eliminar: " . ($_POST['imagen_pregunta_b_eliminar'] ?? 'NO RECIBIDO'));
            
            // ✅ PASO 1: VERIFICAR SI SE MARCÓ PARA ELIMINACIÓN
            if (!empty($_POST['imagen_pregunta_eliminar']) && $_POST['imagen_pregunta_eliminar'] == '1') {
                eliminarImagenAnterior($imagen_pregunta);
                $imagen_pregunta = null;
                error_log("✅ Imagen principal marcada para eliminación");
            }
            
            if (!empty($_POST['imagen_pregunta_a_eliminar']) && $_POST['imagen_pregunta_a_eliminar'] == '1') {
                eliminarImagenAnterior($imagen_pregunta_a);
                $imagen_pregunta_a = null;
                error_log("✅ Imagen A marcada para eliminación");
            }
            
            if (!empty($_POST['imagen_pregunta_b_eliminar']) && $_POST['imagen_pregunta_b_eliminar'] == '1') {
                eliminarImagenAnterior($imagen_pregunta_b);
                $imagen_pregunta_b = null;
                error_log("✅ Imagen B marcada para eliminación");
            }
            
            // ✅ PASO 2: PROCESAR NUEVAS IMÁGENES
            $nuevaImagen = subirImagen('file_pregunta');
            if ($nuevaImagen !== null) {
                eliminarImagenAnterior($imagen_pregunta);
                $imagen_pregunta = $nuevaImagen;
            }
            
            $nuevaImagenA = subirImagen('file_pregunta_a');
            if ($nuevaImagenA !== null) {
                eliminarImagenAnterior($imagen_pregunta_a);
                $imagen_pregunta_a = $nuevaImagenA;
            }
            
            $nuevaImagenB = subirImagen('file_pregunta_b');
            if ($nuevaImagenB !== null) {
                eliminarImagenAnterior($imagen_pregunta_b);
                $imagen_pregunta_b = $nuevaImagenB;
            }

            $sql = "UPDATE Preguntas SET materia_id=?, pregunta=?, imagen_pregunta=?, pregunta_a=?, imagen_pregunta_a=?, pregunta_b=?, imagen_pregunta_b=?, opcion1=?, opcion2=?, opcion3=?, opcion4=?, opcion5=?, correcta_rpta=?, detalle_rpta=? WHERE Id=?";
            $stmt = $conn->prepare($sql);
            
            if (!$stmt) {
                throw new Exception("Error al preparar la consulta: " . $conn->error);
            }
            
            $stmt->bind_param("ssssssssssssssi", $materia_id, $pregunta, $imagen_pregunta, $pregunta_a, $imagen_pregunta_a, $pregunta_b, $imagen_pregunta_b, $opcion1, $opcion2, $opcion3, $opcion4, $opcion5, $correcta_rpta, $detalle_rpta, $id);

            if ($stmt->execute()) {
                echo "Pregunta actualizada correctamente.";
                error_log("✅ Pregunta ID $id actualizada");
            } else {
                throw new Exception("Error al actualizar: " . $stmt->error);
            }
        } catch (Exception $e) {
            error_log("❌ ERROR en actualizar: " . $e->getMessage());
            echo "Error: " . $e->getMessage();
        }
        break;

    case 'eliminar':
        try {
            $id = $_POST['id'] ?? '';
            
            if (empty($id)) {
                exit("ID de pregunta no válido.");
            }
            
            // ✅ OBTENER RUTAS DE IMÁGENES ANTES DE ELIMINAR
            $stmtImg = $conn->prepare("SELECT imagen_pregunta, imagen_pregunta_a, imagen_pregunta_b FROM Preguntas WHERE Id = ?");
            $stmtImg->bind_param("i", $id);
            $stmtImg->execute();
            $resultado = $stmtImg->get_result();
            
            if ($resultado->num_rows === 0) {
                exit("La pregunta con ID $id no existe.");
            }
            
            $imagenes = $resultado->fetch_assoc();
            
            // ✅ ELIMINAR REGISTRO DE BD
            $stmt = $conn->prepare("DELETE FROM Preguntas WHERE Id = ?");
            $stmt->bind_param("i", $id);

            if ($stmt->execute()) {
                // ✅ ELIMINAR IMÁGENES DEL SERVIDOR
                eliminarImagenAnterior($imagenes['imagen_pregunta']);
                eliminarImagenAnterior($imagenes['imagen_pregunta_a']);
                eliminarImagenAnterior($imagenes['imagen_pregunta_b']);
                
                echo "Pregunta eliminada correctamente.";
                error_log("✅ Pregunta ID $id eliminada");
            } else {
                throw new Exception("Error al eliminar: " . $stmt->error);
            }
        } catch (Exception $e) {
            error_log("❌ ERROR en eliminar: " . $e->getMessage());
            echo "Error: " . $e->getMessage();
        }
        break;

    default:
        echo "Acción no reconocida.";
        error_log("⚠️ Acción no reconocida: $accion");
        break;
}

$conn->close();
?>