<?php
// cms/reviews-hero-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/reviews-hero/';
$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.
 * @return string|null La ruta relativa final para la DB (ej: 'uploads/reviews-hero/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('reviews_hero_bg_') . '.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 reviews hero image deleted: " . $fullPath); 
        }
    }
}


try {
    $pdo->beginTransaction();

    // 1. Obtener la imagen anterior
    $stmtCurrent = $pdo->query("SELECT background_image FROM cms_reviews_hero WHERE id = 1")->fetch(PDO::FETCH_ASSOC);
    $old_bg_image = $stmtCurrent ? $stmtCurrent['background_image'] : null;
    $background_image = $old_bg_image; // Valor por defecto

    // 2. Procesar y obtener la nueva ruta de imagen (Optimizado y WebP)
    $new_bg_path = handleOptimizedUpload('bg_image_upload', $uploadDirBase);
    
    if ($new_bg_path) {
        // Se subiÃ³ una nueva imagen optimizada
        $background_image = $new_bg_path;
        deleteOldImage($old_bg_image); // Eliminar la imagen anterior
    } elseif (isset($_POST['current_bg_image']) && !empty($_POST['current_bg_image'])) {
        // Mantener la ruta existente del campo oculto si no se subiÃ³ un archivo nuevo
        $background_image = strip_tags($_POST['current_bg_image']);
    }

    // 3. Sanitizar y obtener los datos del Hero (Textos)
    $badge_text = strip_tags(htmlspecialchars_decode($_POST['badge_text'] ?? ''));
    $title_1 = strip_tags(htmlspecialchars_decode($_POST['title_1'] ?? ''));
    $title_2 = strip_tags(htmlspecialchars_decode($_POST['title_2'] ?? ''));
    $description = strip_tags(htmlspecialchars_decode($_POST['description'] ?? ''));
    $card_title = strip_tags(htmlspecialchars_decode($_POST['card_title'] ?? ''));
    $card_subtitle = strip_tags(htmlspecialchars_decode($_POST['card_subtitle'] ?? ''));
    $footer_text = strip_tags(htmlspecialchars_decode($_POST['footer_text'] ?? ''));

    // 4. Actualizar la tabla principal
    $sqlHero = "UPDATE cms_reviews_hero SET 
        badge_text=?, title_1=?, title_2=?, description=?, 
        card_title=?, card_subtitle=?, footer_text=?, background_image=?, updated_at=NOW() 
        WHERE id=1";
    
    $stmtHero = $pdo->prepare($sqlHero);
    $stmtHero->execute([
        $badge_text, $title_1, $title_2, $description, 
        $card_title, $card_subtitle, $footer_text, $background_image 
    ]);

    // 5. Manejar la lista de enlaces (CRUD de cms_review_links)
    $links = json_decode($_POST['links_data'] ?? '[]', true);
    $existingLinkIds = [];

    foreach ($links as $link) {
        $id = intval($link['id'] ?? 0);
        $platform_name = strip_tags($link['platform_name'] ?? '');
        $link_url = strip_tags($link['link_url'] ?? '');
        $button_text = strip_tags($link['button_text'] ?? '');
        $button_color = strip_tags($link['button_color'] ?? '');
        $icon_lucide = strip_tags($link['icon_lucide'] ?? '');
        $sort_order = intval($link['sort_order'] ?? 0);

        if ($id > 0) {
            $sql = "UPDATE cms_review_links SET 
                platform_name=?, link_url=?, button_text=?, button_color=?, 
                icon_lucide=?, sort_order=? WHERE id=? AND hero_id=1";
            $stmt = $pdo->prepare($sql);
            $stmt->execute([$platform_name, $link_url, $button_text, $button_color, $icon_lucide, $sort_order, $id]);
            $existingLinkIds[] = $id;
        } else {
            $sql = "INSERT INTO cms_review_links (hero_id, platform_name, link_url, button_text, button_color, icon_lucide, sort_order) 
                    VALUES (1, ?, ?, ?, ?, ?, ?)";
            $stmt = $pdo->prepare($sql);
            $stmt->execute([$platform_name, $link_url, $button_text, $button_color, $icon_lucide, $sort_order]);
            $existingLinkIds[] = $pdo->lastInsertId();
        }
    }

    // 6. Eliminar enlaces que no fueron enviados
    if (!empty($existingLinkIds)) {
        $placeholders = implode(',', array_fill(0, count($existingLinkIds), '?'));
        $sqlDelete = "DELETE FROM cms_review_links WHERE hero_id = 1 AND id NOT IN ($placeholders)";
        $stmtDelete = $pdo->prepare($sqlDelete);
        $stmtDelete->execute($existingLinkIds);
    } else {
        $pdo->exec("DELETE FROM cms_review_links WHERE hero_id = 1");
    }

    $pdo->commit();
    echo json_encode([
        'success' => true, 
        'message' => 'SiteFlow Actualizado Exitosamente',
        'data' => [
            'background_image' => $background_image 
        ]
    ]);
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500);
    error_log("Error en reviews-hero-update.php: " . $e->getMessage());
    echo json_encode(['success' => false, 'message' => 'Error Al Guardar: ' . $e->getMessage()]);
}
?>