<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

   

    public function render($request, Throwable $exception)
    {
       if ($exception instanceof \App\Exceptions\GlobalException) {
            return $exception->render($request);
        }
        
        // Interceptar errores de sintaxis SQL para URLs incorrectas (como /admin/inventory/logout)
        if ($exception instanceof \Illuminate\Database\QueryException && 
            strpos($exception->getMessage(), '22P02') !== false) {
            
            // Verificar si la ruta contiene patrones específicos que deberían redirigirse
            $path = $request->path();
            
            // Si la URL contiene 'logout', redirigir a la ruta de logout correcta
            if (strpos($path, 'logout') !== false) {
                return redirect('/admin/logout');
            }
            
            // Para otras rutas de inventario incorrectas
            if (strpos($path, 'inventory') !== false) {
                return redirect('/admin/inventory');
            }
            
            return response()->view('errors.invalid-parameter', [
                'exception' => $exception,
                'errorCode' => 400,
                'errorMessage' => 'El parámetro proporcionado no es válido. Intente con un valor numérico.',
                'backUrl' => url('/admin/dashboard')
            ], 400);
        }
        
        // Personaliza la respuesta para errores comunes
        if ($exception instanceof \Symfony\Component\HttpKernel\Exception\HttpException) {
            $statusCode = $exception->getStatusCode();
            
            // Si tenemos una vista personalizada para este código de error, úsala
            if (view()->exists("errors.{$statusCode}")) {
                return response()->view("errors.{$statusCode}", [
                    'exception' => $exception,
                    'errorCode' => $statusCode,
                    'errorMessage' => $exception->getMessage() ?: 'Error ' . $statusCode
                ], $statusCode);
            }
            
            // Para otros errores HTTP, usa la vista genérica
            return response()->view("errors.error", [
                'exception' => $exception,
                'errorCode' => $statusCode,
                'errorMessage' => $exception->getMessage() ?: 'Error ' . $statusCode
            ], $statusCode);
        }
        
        // Si es un error 500 o cualquier otra excepción no manejada
        if (config('app.debug')) {
            return parent::render($request, $exception);
        }
        
        // En producción, muestra una página de error genérica
        return response()->view('errors.error-500', ['exception' => $exception], 500);
    }

    /**
     * Register the exception handling callbacks for the application.
     *
     * @return void
     */
    public function register()
    {
        
    }
}
