<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class PermMapper
{
    /** HTTP 메서드 → 액션 버킷 */
    private array $actionMap = [
        'GET' => 'view',
        'HEAD' => 'view',
        'POST' => 'create',
        'PUT' => 'update',
        'PATCH' => 'update',
        'DELETE' => 'delete',
    ];

    public function handle(Request $request, Closure $next)
    {
        $route = $request->route();
        if (! $route) {
            return $next($request);
        }

        // 1) 이미 perm이 attributes에 있으면 존중
        if ($request->attributes->get('perm')) {
            return $next($request);
        }

        // 2) 라우트 defaults로 강제 지정된 perm/permission 우선
        $forced = $route->defaults['perm'] ?? $route->defaults['permission'] ?? null;
        if ($forced) {
            $request->attributes->set('perm', $forced);

            return $next($request);
        }

        // 3) menu_id 가 지정된 경우: HTTP 메서드 → 액션으로 perm 생성
        $menuId = $route->defaults['menu_id'] ?? null;
        if ($menuId) {
            $action = $this->actionMap[$request->method()] ?? 'view';
            $request->attributes->set('perm', "menu:{$menuId}.{$action}");
        }

        // 4) menu_id/perm 둘 다 없으면 설정 안 함(체크 미들웨어 정책에 따름)
        return $next($request);
    }
}
