<?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): void {
        $middleware->web(append: [
            \App\Http\Middleware\SecurityHeaders::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions): void {
        // Renderer amigable para errores en /admin/*: convierte excepciones técnicas
        // (especialmente SQL) en una redirección back() con un mensaje claro que el
        // layout admin muestra como SweetAlert modal. Detalle técnico va al log.
        $exceptions->render(function (\Throwable $e, $request) {
            if (config('app.debug')) {
                return null; // En local/debug mantenemos la pantalla detallada de Laravel.
            }
            if (!$request->is('admin/*')) {
                return null;
            }
            if ($request->expectsJson() || $request->ajax()) {
                return null;
            }

            // Excepciones que Laravel ya maneja bien (validación, auth, 404, etc.).
            $passthrough = [
                \Illuminate\Validation\ValidationException::class,
                \Illuminate\Auth\AuthenticationException::class,
                \Illuminate\Auth\Access\AuthorizationException::class,
                \Illuminate\Session\TokenMismatchException::class,
                \Symfony\Component\HttpKernel\Exception\HttpException::class,
                \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class,
                \Illuminate\Database\Eloquent\ModelNotFoundException::class,
            ];
            foreach ($passthrough as $cls) {
                if ($e instanceof $cls) return null;
            }

            if ($e instanceof \Illuminate\Database\QueryException) {
                $code = (int) ($e->errorInfo[1] ?? 0);
                $msg = match (true) {
                    $code === 1062 => 'Ya existe un registro con esos datos. Verificá si no fue cargado previamente o si se encuentra en la papelera.',
                    in_array($code, [1451, 1452], true) => 'Esta operación no se puede completar porque existen datos relacionados (jugadores, equipos o eventos vinculados).',
                    default => 'Hubo un problema con la base de datos. Intentá nuevamente o contactá al administrador.',
                };
                \Log::error('[admin] QueryException', [
                    'code' => $code,
                    'message' => $e->getMessage(),
                    'url' => $request->fullUrl(),
                ]);
                return back()->withInput()->with('admin_error_modal', $msg);
            }

            \Log::error('[admin] Excepción no manejada', [
                'exception' => $e->getMessage(),
                'class' => get_class($e),
                'url' => $request->fullUrl(),
            ]);
            return back()->withInput()->with(
                'admin_error_modal',
                'Ocurrió un error inesperado al procesar la solicitud. Intentá nuevamente o contactá al administrador.'
            );
        });
    })->create();
