<?php
// cms/offer-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/offer/'; 
// Ruta COMPLETA para usar en PHP (sale de cms/ para ir a /uploads/offer/)
$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/offer/').
 * @return string|null La ruta relativa final para la DB (ej: 'uploads/offer/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('offer_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 (ej: 'uploads/offer/nombre.webp').
 */
function deleteOldImage(?string $dbPath): void {
    // Si la ruta no es nula, no es una ruta de fallback (img/default-...) o URL absoluta (http/https)
    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 image deleted: " . $fullPath); // Log opcional
        }
    }
}


try {
    $pdo->beginTransaction();

    // 1. Sanitizar y DECODIFICAR inputs de texto (corrección de &amp;)
    $offer_title_1 = strip_tags(htmlspecialchars_decode($_POST['offer-title-1'] ?? ''));
    $offer_description = strip_tags(htmlspecialchars_decode($_POST['offer-description'] ?? ''));
    $modal_title = strip_tags(htmlspecialchars_decode($_POST['modal-title'] ?? ''));
    $modal_subtitle = strip_tags(htmlspecialchars_decode($_POST['modal-subtitle'] ?? ''));
    
    // 2. Lógica de Descuento
    $discount_type = strip_tags($_POST['discount-type'] ?? 'percentage');
    $discount_value = floatval($_POST['discount-value'] ?? 0);
    $timer_enabled = isset($_POST['timer-enabled']) ? 1 : 0;
    
    // 3. Obtener la ruta de imagen actual ANTES de subir la nueva
    $currentRecord = $pdo->query("SELECT offer_bg_image FROM cms_offer_page WHERE id = 1")->fetch(PDO::FETCH_ASSOC);
    $old_offer_bg_image = $currentRecord ? $currentRecord['offer_bg_image'] : null;
    $offer_bg_image = $old_offer_bg_image; // Valor por defecto si no se sube nada

    // 4. Manejar Subida de Imagen de Fondo (Optimizado y WebP)
    $new_bg_path = handleOptimizedUpload('offer-bg-image-upload', $uploadDirBase);
    
    if ($new_bg_path) {
        // Se subió una nueva imagen optimizada
        $offer_bg_image = $new_bg_path;
        deleteOldImage($old_offer_bg_image); // Eliminar la imagen anterior
    } elseif (isset($_POST['current-offer-bg-image']) && !empty($_POST['current-offer-bg-image'])) {
        // Mantiene la ruta existente si no se subió un archivo nuevo (ruta pasada desde el hidden input)
        $offer_bg_image = strip_tags($_POST['current-offer-bg-image']);
    }
    
    // 5. Determinar el Título 2 (offer_title_2) para guardar en la BD
    $offer_title_2 = "";
    if ($discount_type === 'special_price') {
        // Si es precio especial, usa el texto fijo del formulario
        $offer_title_2 = strip_tags(htmlspecialchars_decode($_POST['offer-title-2-special'] ?? ''));
        $discount_value = 0.00; // Deshabilitamos el valor numérico
    } else {
        // Para porcentaje o monto fijo, generamos el texto
        $symbol = ($discount_type === 'percentage') ? '%' : '$';
        $formatted_value = ($discount_type === 'percentage') ? round($discount_value) : number_format($discount_value, 2);
        $offer_title_2 = "GET {$symbol}{$formatted_value} OFF";
    }

    // 6. Actualizar la BD
    $sql = "UPDATE cms_offer_page SET 
        offer_title_1=?, offer_title_2=?, offer_description=?, 
        modal_title=?, modal_subtitle=?, discount_type=?, 
        discount_value=?, timer_enabled=?, offer_bg_image=?
    WHERE id=1";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $offer_title_1, $offer_title_2, $offer_description, 
        $modal_title, $modal_subtitle, $discount_type, 
        $discount_value, $timer_enabled, $offer_bg_image
    ]);

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