<?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/diferenciators/';
$uploadDirFull = '../' . $uploadDirBase;

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

// Valores de entrada sanitizados al inicio
$differentiators_badge = $_POST['differentiators-badge'] ?? '';
$differentiators_title = $_POST['differentiators-title'] ?? '';
$differentiators_description = $_POST['differentiators-description'] ?? '';
$items = json_decode($_POST['items_json'] ?? '[]', true);
$currentBgImagePath = $_POST['current-differentiators-bg-image'] ?? null; // Ruta actual pasada desde el formulario

// Función de subida/optimización centralizada
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ándar para imagen de fondo
    
    $fileName = uniqid('diff_bg_') . '.webp'; // Fuerza la extensión a WEBP
    $destinationPathFull = '../' . $baseUploadDir . $fileName;

    // Llama a la función de optimización (se asume que existe en image_optimizer.php)
    $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/diferenciators/nombre.webp').
 */
function deleteOldImage(?string $dbPath): void {
    if ($dbPath && !str_starts_with($dbPath, 'img/') && !str_starts_with($dbPath, 'https://') && !str_starts_with($dbPath, 'http://')) {
        // Aseguramos que solo borramos imágenes dentro de la carpeta de uploads.
        $fullPath = '../' . $dbPath; 
        if (file_exists($fullPath) && is_writable($fullPath)) {
            unlink($fullPath);
            // error_log("Old image deleted: " . $fullPath); // Log opcional
        }
    }
}


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

    // 1. Sanitizar y validar inputs
    $differentiators_badge = htmlspecialchars(strip_tags($differentiators_badge));
    $differentiators_title = htmlspecialchars(strip_tags($differentiators_title));
    $differentiators_description = htmlspecialchars(strip_tags($differentiators_description));

    // 2. Determinar si hay una imagen anterior para posible eliminación
    $stmtCurrent = $pdo->query("SELECT id, differentiators_bg_image FROM cms_differentiators ORDER BY updated_at DESC LIMIT 1");
    $currentRecord = $stmtCurrent->fetch(PDO::FETCH_ASSOC);
    $differentiatorsId = $currentRecord ? $currentRecord['id'] : null;
    $oldImagePath = $currentRecord ? $currentRecord['differentiators_bg_image'] : null;

    // 3. Manejar subida de imagen de fondo (Optimización)
    $new_bg_path = handleOptimizedUpload('differentiators-bg-image-upload', $uploadDirBase);
    
    if ($new_bg_path) {
        // Se subió una nueva imagen optimizada
        $bg_image_path = $new_bg_path;
        deleteOldImage($oldImagePath); // Eliminar la imagen anterior
    } else {
        // Mantener la ruta actual si no se subió un archivo nuevo
        $bg_image_path = $oldImagePath; 
    }


    // 4. Insertar/Actualizar en la tabla principal
    if ($differentiatorsId) {
        $sql = "UPDATE cms_differentiators SET differentiators_bg_image=?, differentiators_badge=?, differentiators_title=?, differentiators_description=? WHERE id=?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$bg_image_path, $differentiators_badge, $differentiators_title, $differentiators_description, $differentiatorsId]);
    } else {
        $sql = "INSERT INTO cms_differentiators (differentiators_bg_image, differentiators_badge, differentiators_title, differentiators_description) VALUES (?, ?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$bg_image_path, $differentiators_badge, $differentiators_title, $differentiators_description]);
        $differentiatorsId = $pdo->lastInsertId();
    }

    // 5. Actualizar diferenciadores (Items)
    if ($differentiatorsId) {
        // Eliminar items antiguos (se asume que se recrean completamente)
        $stmtDelete = $pdo->prepare("DELETE FROM cms_differentiators_items WHERE differentiators_id = ?");
        $stmtDelete->execute([$differentiatorsId]);

        // Insertar nuevos diferenciadores
        $sqlItem = "INSERT INTO cms_differentiators_items (differentiators_id, item_icon, item_title, item_description) VALUES (?, ?, ?, ?)";
        $stmtItem = $pdo->prepare($sqlItem);
        
        // Ajustamos la lógica para usar los datos del JSON y no los datos hardcodeados en el archivo original
        foreach ($items as $item) {
            // Aseguramos que los datos del JSON est\u00e9n presentes y limpios.
            $icon = htmlspecialchars(strip_tags($item['icon'] ?? ''));
            $title = htmlspecialchars(strip_tags($item['title'] ?? ''));
            $description = htmlspecialchars(strip_tags($item['description'] ?? ''));
            if ($title) {
                $stmtItem->execute([$differentiatorsId, $icon, $title, $description]);
            }
        }
    }

    $pdo->commit();
    echo json_encode([
        'success' => true, 
        'message' => 'SiteFlow Actualizado Exitosamente',
        'data' => [
            'differentiators_bg_image' => $bg_image_path // Devuelve la nueva ruta para actualizar el frontend
        ]
    ]);
} catch (Exception $e) {
    if ($pdo->inTransaction()) {
        $pdo->rollBack();
    }
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]);
}
?>