<?php
// cms/process-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/process/'; // Ruta BASE para guardar en DB
// Ruta COMPLETA para usar en PHP (sale de cms/ para ir a /uploads/process/)
$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 string $fileInputName Nombre del campo en $_FILES.
 * @param string $baseUploadDir Ruta base para guardar en DB (ej: 'uploads/process/').
 * @return string|null La ruta relativa final para la DB (ej: 'uploads/process/nombre.webp'), o null si no se subi\u00f3 un nuevo archivo.
 */
function handleOptimizedUpload($fileInputName, $baseUploadDir) {
    if (!isset($_FILES[$fileInputName]) || $_FILES[$fileInputName]['error'] !== UPLOAD_ERR_OK) {
        return null;
    }
    
    $file = $_FILES[$fileInputName];
    $tempPath = $file['tmp_name'];

    // *** REGLA DE RESOLUCIÓN Y WEBP ***
    $maxWidth = 1920; // Ancho est\u00e1ndar para imagen de fondo
    
    $fileName = uniqid('bg_img_') . '.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 '{$fileInputName}'. Método No Permitido");
    }
    
    // Devuelve la ruta relativa para guardar en la base de datos
    return $baseUploadDir . $fileName;
}

/**
 * Elimina un archivo si existe y si no es una ruta de fallback o URL absoluta.
 * @param string|null $dbPath La ruta guardada en la base de datos.
 */
function deleteOldImage(?string $dbPath): void {
    if ($dbPath && !str_starts_with($dbPath, 'img/') && !str_starts_with($dbPath, 'https://') && !str_starts_with($dbPath, 'http://')) {
        $fullPath = '../' . $dbPath; 
        if (file_exists($fullPath) && is_writable($fullPath)) {
            unlink($fullPath);
            // error_log("Old process image deleted: " . $fullPath); 
        }
    }
}


try {
    // Iniciar transacción
    $pdo->beginTransaction();

    // Sanitizar y validar inputs generales (Se decodifica para el &amp; del paso anterior)
    $process_badge = strip_tags(htmlspecialchars_decode($_POST['process-badge'] ?? ''));
    $process_title_1 = strip_tags(htmlspecialchars_decode($_POST['process-title-1'] ?? ''));
    $process_title_2 = strip_tags(htmlspecialchars_decode($_POST['process-title-2'] ?? ''));
    $process_description = strip_tags(htmlspecialchars_decode($_POST['process-description'] ?? ''));
    
    // Obtener la ID principal y la imagen actual
    $stmt = $pdo->query("SELECT id, process_bg_image FROM cms_process ORDER BY updated_at DESC LIMIT 1");
    $currentRecord = $stmt->fetch(PDO::FETCH_ASSOC);
    $processId = $currentRecord ? $currentRecord['id'] : null;
    $old_bg_image = $currentRecord ? $currentRecord['process_bg_image'] : null;
    $bg_image_path = $old_bg_image; // Valor por defecto

    // Lógica para manejar la imagen de fondo (Optimizado y WebP)
    $new_bg_path = handleOptimizedUpload('process-bg-image-upload', $uploadDirBase);
    
    if ($new_bg_path) {
        // Se subió una nueva imagen optimizada
        $bg_image_path = $new_bg_path;
        deleteOldImage($old_bg_image); // Eliminar la imagen anterior
    } 
    // Si no se subió una nueva imagen, se mantiene la $old_bg_image (ya asignada a $bg_image_path)
    // El campo hidden en el frontend asegura que $old_bg_image sea la ruta relativa de la BD si no hay subida.


    if ($processId) {
        $sql = "UPDATE cms_process SET process_bg_image=?, process_badge=?, process_title_1=?, process_title_2=?, process_description=? WHERE id=?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$bg_image_path, $process_badge, $process_title_1, $process_title_2, $process_description, $processId]);
    } else {
        $sql = "INSERT INTO cms_process (process_bg_image, process_badge, process_title_1, process_title_2, process_description) VALUES (?, ?, ?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$bg_image_path, $process_badge, $process_title_1, $process_title_2, $process_description]);
        $processId = $pdo->lastInsertId();
    }
    
    // Procesar los pasos del proceso
    $items = json_decode($_POST['steps_json'] ?? '[]', true);
    
    // 1. Eliminar pasos antiguos
    if (isset($processId)) {
        $stmt = $pdo->prepare("DELETE FROM cms_process_steps WHERE process_id = ?");
        $stmt->execute([$processId]);

        // 2. Insertar nuevos pasos
        $sqlStep = "INSERT INTO cms_process_steps (process_id, step_icon, step_title, step_description) VALUES (?, ?, ?, ?)";
        $stmtStep = $pdo->prepare($sqlStep);
        
        foreach ($items as $item) {
            $step_icon = strip_tags(htmlspecialchars_decode($item['icon'] ?? ''));
            $step_title = strip_tags(htmlspecialchars_decode($item['title'] ?? ''));
            $step_description = strip_tags(htmlspecialchars_decode($item['description'] ?? ''));

            if (!empty($step_title)) {
                $stmtStep->execute([$processId, $step_icon, $step_title, $step_description]);
            }
        }
    }

    $pdo->commit();
    echo json_encode(['success' => true, 'message' => 'SiteFlow Actualizado Exitosamente', 'data' => ['process_bg_image' => $bg_image_path]]);

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