<?php

/**
 * ImageUpload.php - Manejo de subida de imágenes
 */

// Incluir archivo de validación de token si no está definida
if (!function_exists('validateToken')) {
    require_once '../../modelos/Auth.php';

    function validateToken($conn, $authHeader)
    {
        error_log("Validando token en ImageUpload.php...");

        if (empty($authHeader)) {
            error_log("Header Authorization vacío");
            return null;
        }

        $token = str_replace('Bearer ', '', $authHeader);

        // Usar el modelo Auth para verificar el JWT
        $auth = new Auth($conn);
        $userData = $auth->obtenerUsuarioDeToken($token);

        if ($userData) {
            error_log("Usuario validado: " . $userData['username']);
            return $userData;
        }

        return null;
    }
}

// Función para enviar respuesta JSON (si no está definida)
if (!function_exists('sendResponse')) {
    function sendResponse($success, $message = '', $data = null)
    {
        echo json_encode([
            "success" => $success,
            "message" => $message,
            "data" => $data
        ]);
        exit;
    }
}

// Verificar autenticación
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (empty($authHeader)) {
    $authHeader = getallheaders()['Authorization'] ?? '';
}

// Validar token
$user = validateToken($conn, $authHeader);
if (!$user) {
    sendResponse(false, "No autorizado " . json_encode($authHeader) . " " . json_encode($user));
}

// === SUBIR IMAGEN ===
if ($tipo === 'uploadImage') {
    error_log("=== SUBIENDO IMAGEN ===");

    // Verificar que se envió un archivo
    if (!isset($_FILES['image']) || $_FILES['image']['error'] !== UPLOAD_ERR_OK) {
        $error = $_FILES['image']['error'] ?? 'No se envió archivo';
        error_log("Error en upload: " . $error);
        sendResponse(false, "Error al subir imagen: " . $error);
    }

    $file = $_FILES['image'];
    $fileName = $file['name'];
    $fileSize = $file['size'];
    $fileTmpName = $file['tmp_name'];
    $fileType = $file['type'];

    // Validar tipo de archivo
    $allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
    if (!in_array($fileType, $allowedTypes)) {
        sendResponse(false, "Tipo de archivo no permitido. Solo se permiten: JPG, PNG, GIF, WEBP");
    }

    // Validar tamaño (máximo 5MB)
    $maxSize = 5 * 1024 * 1024; // 5MB
    if ($fileSize > $maxSize) {
        sendResponse(false, "El archivo es demasiado grande. Máximo 5MB");
    }

    // Crear directorio si no existe
    $uploadDir = '../../uploads/productos/';
    if (!is_dir($uploadDir)) {
        if (!mkdir($uploadDir, 0755, true)) {
            error_log("No se pudo crear directorio: " . $uploadDir);
            sendResponse(false, "Error creando directorio de uploads");
        }
    }

    // Generar nombre único para el archivo
    $fileExtension = pathinfo($fileName, PATHINFO_EXTENSION);
    $newFileName = uniqid('producto_', true) . '.' . strtolower($fileExtension);
    $uploadPath = $uploadDir . $newFileName;

    try {
        // Mover archivo subido
        if (!move_uploaded_file($fileTmpName, $uploadPath)) {
            error_log("No se pudo mover archivo de $fileTmpName a $uploadPath");
            sendResponse(false, "Error al guardar imagen");
        }

        // Generar URL relativa para la base de datos
        $imageUrl = 'uploads/productos/' . $newFileName;

        error_log("Imagen subida exitosamente: " . $imageUrl);

        sendResponse(true, "Imagen subida exitosamente", [
            'url' => $imageUrl,
            'filename' => $newFileName,
            'original_name' => $fileName
        ]);
    } catch (Exception $e) {
        error_log("Error subiendo imagen: " . $e->getMessage());
        sendResponse(false, "Error al procesar imagen");
    }
}

// === ELIMINAR IMAGEN ===
if ($tipo === 'deleteImage') {
    error_log("=== ELIMINANDO IMAGEN ===");

    $imageUrl = isset($datapost['image_url']) ? $datapost['image_url'] : '';

    if (empty($imageUrl)) {
        sendResponse(false, "URL de imagen requerida");
    }

    try {
        // Construir ruta completa del archivo
        $filePath = '../../' . $imageUrl;

        if (file_exists($filePath)) {
            if (unlink($filePath)) {
                error_log("Imagen eliminada: " . $filePath);
                sendResponse(true, "Imagen eliminada exitosamente");
            } else {
                error_log("No se pudo eliminar: " . $filePath);
                sendResponse(false, "Error al eliminar imagen");
            }
        } else {
            error_log("Archivo no existe: " . $filePath);
            sendResponse(true, "La imagen ya no existe");
        }
    } catch (Exception $e) {
        error_log("Error eliminando imagen: " . $e->getMessage());
        sendResponse(false, "Error al eliminar imagen");
    }
}
