<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class CustomValidatePostSize
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        // Get PHP post_max_size and convert to bytes
        $postMaxSize = $this->getBytes(ini_get('post_max_size'));
        
        // Allow up to 50MB for uploads (custom limit)
        $maxSize = $this->getBytes('50M');
        
        // Use the larger of the two (but allow our custom limit)
        $maxSize = max($postMaxSize, $maxSize);
        
        if ($request->server('CONTENT_LENGTH') > $maxSize) {
            return response()->json([
                'error' => 'The POST data is too large. Maximum allowed: ' . $this->formatBytes($maxSize)
            ], 413);
        }

        return $next($request);
    }
    
    /**
     * Convert shorthand byte notation to bytes
     */
    private function getBytes($size): int
    {
        $size = trim($size);
        $last = strtolower($size[strlen($size) - 1]);
        $size = (int) $size;
        
        switch ($last) {
            case 'g':
                $size *= 1024;
                // fall through
            case 'm':
                $size *= 1024;
                // fall through
            case 'k':
                $size *= 1024;
        }
        
        return $size;
    }
    
    /**
     * Format bytes to human readable format
     */
    private function formatBytes($bytes): string
    {
        if ($bytes >= 1073741824) {
            return number_format($bytes / 1073741824, 2) . ' GB';
        } elseif ($bytes >= 1048576) {
            return number_format($bytes / 1048576, 2) . ' MB';
        } elseif ($bytes >= 1024) {
            return number_format($bytes / 1024, 2) . ' KB';
        } else {
            return $bytes . ' bytes';
        }
    }
}

