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

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

/**
 * Procesa la subida de archivo (POST o Base64), optimiza, redimensiona y fuerza la conversi\u00f3n a WebP.
 * @param array|string $fileData El array $_FILES de la imagen o la cadena Base64.
 * @param string $baseUploadDir Ruta base para guardar en DB.
 * @return string|null La ruta relativa final para la DB (ej: 'uploads/services/nombre.webp'), o null si no se subi\u00f3.
 */
function handleOptimizedUpload($fileData, $baseUploadDir) {
    
    $tempPath = null;
    $isTempFile = false; // Flag para saber si necesitamos borrar el archivo temporal
    
    // --- Lógica de Base64 ---
    if (is_string($fileData) && str_starts_with($fileData, 'data:image/')) {
        if (!preg_match('/^data:image\/(\w+);base64,/', $fileData, $type)) {
            throw new Exception('Formato Base64 inv\u00e1lido.');
        }
        $data = substr($fileData, strpos($fileData, ',') + 1);
        $data = base64_decode($data);
        
        $tempPath = tempnam(sys_get_temp_dir(), 'service_b64_');
        if (!file_put_contents($tempPath, $data)) {
            throw new Exception('Error al guardar archivo Base64 temporalmente.');
        }
        $isTempFile = true;
        
    } 
    // --- Lógica de $_FILES tradicional ---
    elseif (is_array($fileData) && isset($fileData['tmp_name']) && $fileData['error'] === UPLOAD_ERR_OK) {
        $tempPath = $fileData['tmp_name'];
    } else {
        return null; // No hay archivo v\u00e1lido para subir
    }

    // *** OPTIMIZACIÓN Y WEBP ***
    $maxWidth = 1000; // Un ancho razonable para la imagen de un servicio
    $fileName = uniqid('service_img_') . '.webp'; // Fuerza la extensi\u00f3n
    $destinationPathFull = '../' . $baseUploadDir . $fileName;

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

    // Limpiar archivo temporal si fue Base64
    if ($isTempFile && file_exists($tempPath)) {
        unlink($tempPath);
    }

    if (!$success) {
        throw new Exception("Método No Permitido");
    }
    
    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/services/')) {
        $fullPath = '../' . $dbPath; 
        if (file_exists($fullPath) && is_writable($fullPath)) {
            unlink($fullPath);
        }
    }
}


try {
    $pdo->beginTransaction();

    // === INICIO DE CORRECCIÓN DEL AMPERSAND ===
    $services_badge = strip_tags(htmlspecialchars_decode($_POST['services-badge'] ?? ''));
    $services_title_1 = strip_tags(htmlspecialchars_decode($_POST['services-title-1'] ?? ''));
    $services_title_2 = strip_tags(htmlspecialchars_decode($_POST['services-title-2'] ?? ''));
    $services_description = strip_tags(htmlspecialchars_decode($_POST['services-description'] ?? ''));
    // === FIN DE CORRECCIÓN DEL AMPERSAND ===

    // 1. Actualizar la tabla principal
    $stmt = $pdo->query("SELECT id FROM cms_services ORDER BY updated_at DESC LIMIT 1");
    $currentRecord = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($currentRecord) {
        $serviceId = $currentRecord['id'];
        $sql = "UPDATE cms_services SET services_badge=?, services_title_1=?, services_title_2=?, services_description=? WHERE id=?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$services_badge, $services_title_1, $services_title_2, $services_description, $serviceId]);
    } else {
        $sql = "INSERT INTO cms_services (services_badge, services_title_1, services_title_2, services_description) VALUES (?, ?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$services_badge, $services_title_1, $services_title_2, $services_description]);
        $serviceId = $pdo->lastInsertId();
    }
    
    // 2. Obtener rutas de im\u00e1genes antiguas para eliminaci\u00f3n
    $stmtOldPaths = $pdo->prepare("SELECT item_image FROM cms_service_items WHERE service_id = ? AND item_image IS NOT NULL AND item_image NOT LIKE 'http%'");
    $stmtOldPaths->execute([$serviceId]);
    $oldImagePaths = $stmtOldPaths->fetchAll(PDO::FETCH_COLUMN, 0);

    // 3. Eliminar items de la base de datos
    if (isset($serviceId)) {
        $stmtDelete = $pdo->prepare("DELETE FROM cms_service_items WHERE service_id = ?");
        $stmtDelete->execute([$serviceId]);
    }
    
    $servicesJson = $_POST['services_json'] ?? '[]';
    $newServices = json_decode($servicesJson, true);

    $sqlService = "INSERT INTO cms_service_items (service_id, item_image, item_icon, item_title, item_description, item_benefits) VALUES (?, ?, ?, ?, ?, ?)";
    $stmtService = $pdo->prepare($sqlService);
    
    $pathsToKeep = []; // Rutas optimizadas para evitar la eliminaci\u00f3n f\u00edsica
    
    foreach ($newServices as $service) {
        
        $serviceIdFromData = $service['id'] ?? null;
        $imagePath = $service['item_image'] ?? null;
        $fileInputName = "service-image-upload-{$serviceIdFromData}";

        // Procesamiento de la imagen (WebP + Optimizaci\u00f3n)
        $new_path = null;
        
        if (isset($_FILES[$fileInputName]) && $_FILES[$fileInputName]['error'] === UPLOAD_ERR_OK) {
            // Subida POST tradicional
            $new_path = handleOptimizedUpload($_FILES[$fileInputName], $uploadDirBase);
        } elseif (str_starts_with($imagePath, 'data:image/')) {
            // Subida Base64
            $new_path = handleOptimizedUpload($imagePath, $uploadDirBase);
        }

        // Determinar la ruta final: nueva optimizada, o la ruta existente (que debemos preservar)
        $finalImagePath = $new_path ?? $imagePath;

        // Limpieza de texto
        $icon = strip_tags(htmlspecialchars_decode($service['item_icon'] ?? ''));
        $title = strip_tags(htmlspecialchars_decode($service['item_title'] ?? ''));
        $description = strip_tags(htmlspecialchars_decode($service['item_description'] ?? ''));
        $benefitsArray = $service['item_benefits'] ?? [];
        $itemBenefitsJson = json_encode($benefitsArray);

        // Limpiar la ruta para la DB si viene con prefijo
        if (str_starts_with($finalImagePath, '../')) {
            $finalImagePath = substr($finalImagePath, 3);
        }

        // Inserci\u00f3n en la DB y registro de paths a mantener
        if (!empty($title)) {
            $stmtService->execute([$serviceId, $finalImagePath, $icon, $title, $description, $itemBenefitsJson]);
            if ($finalImagePath && !str_starts_with($finalImagePath, 'http')) {
                 $pathsToKeep[] = $finalImagePath;
            }
        }
    }
    
    // 4. ELIMINAR ARCHIVOS FÍSICOS OBSOLETOS
    $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()]);
}
?>