<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {

        // ── Middlewares globales ──────────────────────────────────────────────
        $middleware->append(\App\Http\Middleware\SecurityHeaders::class);

        // ── Aliases — Spatie Permission v6 + Laravel 12 ──────────────────────
        $middleware->alias([
            'sucursal'           => \App\Http\Middleware\CheckSucursal::class,
            'role'               => \Spatie\Permission\Middleware\RoleMiddleware::class,
            'permission'         => \Spatie\Permission\Middleware\PermissionMiddleware::class,
            'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
        ]);

        // ── Orden: sucursal antes que permission ─────────────────────────────
        $middleware->priority([
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Auth\Middleware\Authenticate::class,
            \App\Http\Middleware\CheckSucursal::class,
            \Spatie\Permission\Middleware\RoleMiddleware::class,
            \Spatie\Permission\Middleware\PermissionMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {

        $exceptions->render(function (\Illuminate\Auth\Access\AuthorizationException $e, $request) {
            if ($request->expectsJson()) {
                return response()->json(['error' => 'No tienes permiso para esta acción.'], 403);
            }
            return redirect()->route('dashboard')->with('error', 'No tienes permiso para realizar esta acción o acceder a este recurso.');
        });

        // Manejar la excepción específica de Spatie
        $exceptions->render(function (\Spatie\Permission\Exceptions\UnauthorizedException $e, $request) {
            if ($request->expectsJson()) {
                return response()->json(['error' => 'No cuentas con los permisos o roles necesarios.'], 403);
            }
            $mensaje = $e->getMessage() ?: 'Acceso denegado: no cuentas con los permisos necesarios.';
            return redirect()->route('dashboard')->with('error', $mensaje);
        });

        $exceptions->render(function (\Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException $e, $request) {
            if ($request->expectsJson()) {
                return response()->json(['error' => 'No tienes permiso para esta acción.'], 403);
            }
            $mensaje = $e->getMessage() ?: 'No tienes permiso para realizar esta acción.';
            return redirect()->route('dashboard')->with('error', $mensaje);
        });

        $exceptions->render(function (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e, $request) {
            // Verificar si el 404 fue provocado internamente por un ModelNotFoundException (es decir, el Global Scope bloqueó el acceso)
            if ($e->getPrevious() instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
                if ($request->expectsJson()) {
                    return response()->json(['error' => 'El registro no fue encontrado o pertenece a otra sucursal.'], 404);
                }
                return redirect()->route('dashboard')
                                 ->with('error', 'El registro no existe o pertenece a otra sucursal. Por favor, verifica tu contexto activo.');
            }

            // Para otros 404 normales
            if ($request->expectsJson()) {
                return response()->json(['error' => 'Recurso no encontrado.'], 404);
            }

            // Removemos response()->view('errors.404') porque la vista resources/views/errors/404.blade.php no existe.
            // Retornar false hace que Laravel use su vista de error 404 genérica (del vendor).
            return false;
        });
    })
    ->create();