<?php
require_once __DIR__ . '/../../../config/bootstrap.php';
require_once __DIR__ . '/../../../includes/require-auth.php';

use App\Services\AuthService;
use App\Services\SecurityService;
use App\Services\Logger;

header('Content-Type: application/json');

$auth = new AuthService();
$security = new SecurityService();
$logger = new Logger();

// Obtener usuario autenticado
$user = $auth->user();
if (!$user) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'No autenticado']);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['success' => false, 'message' => 'Método no permitido']);
    exit;
}

// Verificar que se envió un archivo
if (!isset($_FILES['logo']) || $_FILES['logo']['error'] === UPLOAD_ERR_NO_FILE) {
    echo json_encode(['success' => false, 'message' => 'No se recibió ningún archivo']);
    exit;
}

$file = $_FILES['logo'];

// Verificar errores de subida
if ($file['error'] !== UPLOAD_ERR_OK) {
    $logger->error('Error uploading logo: ' . $file['error']);
    echo json_encode(['success' => false, 'message' => 'Error al subir el archivo']);
    exit;
}

// Validar tipo de archivo
$allowedTypes = ['image/png', 'image/jpeg', 'image/jpg', 'image/svg+xml'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);

if (!in_array($mimeType, $allowedTypes)) {
    echo json_encode([
        'success' => false,
        'message' => 'Tipo de archivo no permitido. Solo se permiten: PNG, JPG, JPEG, SVG'
    ]);
    exit;
}

// Validar tamaño (máximo 5MB)
$maxSize = 5 * 1024 * 1024; // 5MB
if ($file['size'] > $maxSize) {
    echo json_encode([
        'success' => false,
        'message' => 'El archivo es demasiado grande. Tamaño máximo: 5MB'
    ]);
    exit;
}

// Validar dimensiones (opcional, solo para imágenes raster)
if (in_array($mimeType, ['image/png', 'image/jpeg', 'image/jpg'])) {
    list($width, $height) = getimagesize($file['tmp_name']);

    // Recomendación: logos no deberían ser más grandes que 1000x1000
    if ($width > 2000 || $height > 2000) {
        echo json_encode([
            'success' => false,
            'message' => 'Las dimensiones del logo son demasiado grandes. Máximo recomendado: 2000x2000px'
        ]);
        exit;
    }
}

try {
    // Generar nombre único para el archivo
    $extension = match($mimeType) {
        'image/png' => 'png',
        'image/jpeg', 'image/jpg' => 'jpg',
        'image/svg+xml' => 'svg',
        default => 'bin'
    };

    $timestamp = time();
    $randomStr = bin2hex(random_bytes(8));
    $filename = "logo_{$timestamp}_{$randomStr}.{$extension}";

    // Crear directorio si no existe
    $uploadDir = storage_path('logos');
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }

    $relativePath = "logos/{$filename}";
    $fullPath = storage_path($relativePath);

    // Mover archivo
    if (!move_uploaded_file($file['tmp_name'], $fullPath)) {
        throw new Exception('Error al guardar el archivo');
    }

    // Optimizar imagen si es PNG o JPG
    if (in_array($mimeType, ['image/png', 'image/jpeg'])) {
        optimizeImage($fullPath, $mimeType);
    }

    $logger->info("Logo uploaded: {$relativePath} by user {$user['id']}");

    echo json_encode([
        'success' => true,
        'message' => 'Logo subido exitosamente',
        'path' => $relativePath,
        'url' => base_url("admin/download-logo.php?path={$relativePath}")
    ]);

} catch (Exception $e) {
    $logger->error('Error processing logo upload: ' . $e->getMessage());
    echo json_encode([
        'success' => false,
        'message' => 'Error al procesar el archivo: ' . $e->getMessage()
    ]);
}

/**
 * Optimizar imagen para reducir tamaño
 */
function optimizeImage(string $path, string $mimeType): void
{
    try {
        if ($mimeType === 'image/jpeg') {
            $image = imagecreatefromjpeg($path);
            if ($image) {
                // Comprimir JPEG con calidad 85%
                imagejpeg($image, $path, 85);
                imagedestroy($image);
            }
        } elseif ($mimeType === 'image/png') {
            $image = imagecreatefrompng($path);
            if ($image) {
                // Comprimir PNG
                imagepng($image, $path, 8);
                imagedestroy($image);
            }
        }
    } catch (Exception $e) {
        // Si falla la optimización, continuar sin optimizar
    }
}
