<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

class CheckUserPermissions
{
    /**
     * Manejar una solicitud entrante.
     */
    public function handle(Request $request, Closure $next, $permission = null)
    {
        if (!session('backoffice_authenticated')) {
            return redirect()->route('login');
        }

        $userType = session('backoffice_user_type', 'regular');
        $permissions = session('user_permissions', []);

        // Admin siempre tiene todos los permisos
        if ($userType === 'admin') {
            return $next($request);
        }

        // Si no se especifica permiso, solo verificar autenticación
        if (!$permission) {
            return $next($request);
        }

        // Verificar permisos específicos
        if (!$this->hasPermission($userType, $permissions, $permission, $request)) {
            Log::warning('Access denied for user', [
                'user' => session('backoffice_user'),
                'user_type' => $userType,
                'required_permission' => $permission,
                'route' => $request->route()->getName(),
                'url' => $request->url(),
            ]);

            if ($request->expectsJson()) {
                return response()->json(['error' => 'No tienes permisos para realizar esta acción'], 403);
            }

            return redirect()->route('dashboard')->with('error', 'No tienes permisos para acceder a esta sección.');
        }

        return $next($request);
    }

    /**
     * Verificar si el usuario tiene el permiso requerido
     */
    private function hasPermission(string $userType, array $permissions, string $permission, Request $request): bool
    {
        // Permisos específicos por tipo de usuario
        $routePermissions = [
            // Rutas que requieren permisos de administración completa (solo admin)
            'access-requests.*' => 'manage_access_requests',
            'commercial-advisors.*' => 'manage_advisors',
            'plans.*' => 'manage_plans',
            'users.*' => 'manage_users',
            
            // Rutas accesibles para asesores comerciales y admin
            'companies.*' => 'view_companies',
            'payments.*' => 'view_payments',
            'dashboard*' => 'view_dashboard',
        ];

        $routeName = $request->route()->getName();

        // Verificar permisos por ruta
        foreach ($routePermissions as $pattern => $requiredPermission) {
            if (fnmatch($pattern, $routeName)) {
                return $permissions[$requiredPermission] ?? false;
            }
        }

        // Si el permiso específico está en la lista de permisos del usuario
        if (isset($permissions[$permission])) {
            return $permissions[$permission];
        }

        // Permisos por defecto según tipo de usuario
        switch ($userType) {
            case 'commercial_advisor':
            case 'advisor':
                return in_array($permission, [
                    'view_dashboard',
                    'view_companies',
                    'view_payments',
                    'view_own_clients',
                    'view_reports',
                    'view_commissions',
                    'edit_profile'
                ]);
                
            case 'regular':
                return false; // Los usuarios regulares no tienen acceso al backoffice
                
            default:
                return false;
        }
    }
}