<?php

namespace App\Http\Middleware;

use App\Models\Area;
use App\Support\AreaPermission;
use App\Support\LaundryAuditLogger;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Comprueba que el usuario autenticado pueda operar en el área indicada por `area_code` (body JSON / form).
 * Si el área no existe aún, deja pasar la petición para que el servicio responda 404.
 */
class EnsureAreaOperatePermission
{
    public function handle(Request $request, Closure $next): Response
    {
        $user = $request->user();
        if ($user === null) {
            return response()->json([
                'message' => 'No autenticado.',
                'errors' => ['auth' => ['Debe enviar un token válido.']],
                'meta' => null,
                'data' => null,
            ], Response::HTTP_UNAUTHORIZED);
        }

        $areaCode = $request->input('area_code') ?? $request->input('areaCode');
        if ($areaCode === null || $areaCode === '') {
            return $next($request);
        }

        $area = Area::query()->operational()->where('code', $areaCode)->first();
        if ($area === null) {
            return $next($request);
        }

        if (! AreaPermission::canOperate($user, $area)) {
            LaundryAuditLogger::scanDenied('middleware_area_operate_denied', [
                'area_id' => $area->id,
                'area_code' => $area->code,
                'user_id' => $user->id,
            ]);

            return response()->json([
                'message' => 'No tiene permiso para operar en esta área.',
                'errors' => ['permission' => ['Se requiere permiso '.AreaPermission::operatePermissionName($area->code).' o rol adecuado.']],
                'meta' => null,
                'data' => null,
            ], Response::HTTP_FORBIDDEN);
        }

        return $next($request);
    }
}
