<?php
// cms/results-update.php
header('Content-Type: application/json');

// 1. INCLUIR OPTIMIZADOR Y DB
require_once('image_optimizer.php'); 
require_once('db_connection.php');

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Método No Permitido']);
    exit;
}

// Directorios y variables
$uploadDirBase = '../uploads/gallery/';
$uploadDirFull = '../' . $uploadDirBase; 

if (!is_dir($uploadDirFull)) {
    mkdir($uploadDirFull, 0777, true);
}

/**
 * Procesa la subida de archivo: optimiza, redimensiona y fuerza la conversi\u00f3n a WebP.
 * @param array $fileData Datos del archivo (un \u00edtem de la estructura re-indexada de $_FILES).
 * @param string $baseUploadDir Ruta base para guardar en DB.
 * @return string La ruta relativa final para la DB (ej: 'uploads/gallery/nombre.webp').
 */
function handleOptimizedUpload(array $fileData, string $baseUploadDir): string {
    $tempPath = $fileData['tmp_name'];

    // *** REGLA DE RESOLUCIÓN Y WEBP ***
    $maxWidth = 1600; 
    
    $fileName = uniqid('../gallery_item_') . '.webp'; // Fuerza la extensi\u00f3n a WEBP
    $destinationPathFull = '../' . $baseUploadDir . $fileName;

    // Llama a la funci\u00f3n de optimizaci\u00f3n
    $success = optimizeAndSaveImage($tempPath, $destinationPathFull, $maxWidth);

    if (!$success) {
        throw new Exception("Error Al Optimizar La Imagen");
    }
    
    // Devuelve la ruta relativa para guardar en la base de datos
    return $baseUploadDir . $fileName;
}

/**
 * Elimina un archivo si es una ruta de uploads y no de fallback/URL externa.
 * @param string $dbPath La ruta guardada en la base de datos.
 */
function deleteUploadFile(?string $dbPath): void {
    if ($dbPath && str_starts_with($dbPath, '../uploads/gallery/')) {
        $fullPath = '../' . $dbPath; 
        if (file_exists($fullPath) && is_writable($fullPath)) {
            unlink($fullPath);
            // error_log("Gallery file deleted: " . $fullPath); // Log opcional
        }
    }
}


try {
    $pdo->beginTransaction();

    // Sanitizar y validar inputs generales
    $results_badge = strip_tags(htmlspecialchars_decode($_POST['gallery-badge'] ?? ''));
    $results_title_1 = strip_tags(htmlspecialchars_decode($_POST['gallery-title-1'] ?? ''));
    $results_title_2 = strip_tags(htmlspecialchars_decode($_POST['gallery-title-2'] ?? ''));

    // Obtener la ID principal de la sección
    $stmt = $pdo->query("SELECT id FROM cms_results ORDER BY updated_at DESC LIMIT 1");
    $currentRecord = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($currentRecord) {
        $resultsId = $currentRecord['id'];
        $sql = "UPDATE cms_results SET results_badge=?, results_title_1=?, results_title_2=? WHERE id=?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$results_badge, $results_title_1, $results_title_2, $resultsId]);
    } else {
        $sql = "INSERT INTO cms_results (results_badge, results_title_1, results_title_2) VALUES (?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$results_badge, $results_title_1, $results_title_2]);
        $resultsId = $pdo->lastInsertId();
    }
    
    // =======================================================================
    // LÓGICA DE LIMPIEZA DE ARCHIVOS ANTIGUOS
    // 1. Obtener todas las rutas actuales de la galería
    $stmtOldPaths = $pdo->prepare("SELECT item_path FROM cms_gallery_items WHERE results_id = ? AND item_type = 'image'");
    $stmtOldPaths->execute([$resultsId]);
    $oldImagePaths = $stmtOldPaths->fetchAll(PDO::FETCH_COLUMN, 0);

    // 2. Eliminar items de la base de datos (DELETE ALL / INSERT ALL)
    $stmtDeleteDb = $pdo->prepare("DELETE FROM cms_gallery_items WHERE results_id = ?");
    $stmtDeleteDb->execute([$resultsId]);

    // =======================================================================
    // 3. Procesar items de la galería e INSERTAR NUEVOS REGISTROS

    $items = json_decode($_POST['items_json'] ?? '[]', true);
    $pathsToKeep = []; // Rutas que se reinsertarán (para no borrarlas)
    
    $sqlItem = "INSERT INTO cms_gallery_items (results_id, item_type, item_path) VALUES (?, ?, ?)";
    $stmtItem = $pdo->prepare($sqlItem);

    // Reestructurar el array $_FILES para un manejo m\u00e1s f\u00e1cil
    $uploadedFiles = [];
    if (isset($_FILES['gallery_images_upload'])) {
        foreach ($_FILES['gallery_images_upload']['name'] as $key => $name) {
            if ($_FILES['gallery_images_upload']['error'][$key] === UPLOAD_ERR_OK) {
                $uploadedFiles[$key] = [
                    'name' => $name,
                    'type' => $_FILES['gallery_images_upload']['type'][$key],
                    'tmp_name' => $_FILES['gallery_images_upload']['tmp_name'][$key],
                    'error' => $_FILES['gallery_images_upload']['error'][$key],
                    'size' => $_FILES['gallery_images_upload']['size'][$key],
                ];
            }
        }
    }
    
    if (is_array($items)) {
        foreach ($items as $item) {
            $item_type = strip_tags(htmlspecialchars_decode($item['type'] ?? ''));
            $item_path = strip_tags(htmlspecialchars_decode($item['path'] ?? ''));
            
            $final_path = $item_path;

            // CASO A: Es una imagen NUEVA (usamos el file_index)
            if ($item_type === 'image' && isset($item['file_index']) && isset($uploadedFiles[$item['file_index']])) {
                $final_path = handleOptimizedUpload($uploadedFiles[$item['file_index']], $uploadDirBase);
                
            }
            // CASO B: Es una imagen existente (la ruta ya est\u00e1 en $item_path) o es un v\u00eddeo
            // No hacemos nada, $final_path ya tiene el valor de $item_path
            
            if (!empty($final_path)) {
                $stmtItem->execute([$resultsId, $item_type, $final_path]);
                
                // Si la ruta no es un v\u00eddeo (URL externa), la agregamos a las rutas a mantener
                if ($item_type === 'image') {
                    $pathsToKeep[] = $final_path;
                }
            }
        }
    }

    // 4. ELIMINAR ARCHIVOS FÍSICOS OBSOLETOS
    // Borrar de la carpeta de uploads las rutas antiguas que NO se reinsertaron.
    $pathsToDelete = array_diff($oldImagePaths, $pathsToKeep);
    foreach ($pathsToDelete as $path) {
        deleteUploadFile($path);
    }


    $pdo->commit();
    echo json_encode(['success' => true, 'message' => 'SiteFlow Actualizado Exitosamente']);
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]);
}
?>