import { Request, Response, NextFunction } from "express";

/**
 * Estructura estándar de respuesta de error que se envía al cliente.
 */
interface ErrorResponse {
  success: boolean;
  message: string;
  error?: any;
}

/**
 * Middleware global de manejo de errores para Express.
 *
 * Debe registrarse al final de la cadena de middlewares en `app.ts`
 * (después de todas las rutas) para capturar errores propagados con `next(err)`.
 *
 * Comportamiento:
 * - Si el código de estado de la respuesta es 200 (sin código de error explícito),
 *   lo reemplaza con 500 (Internal Server Error).
 * - Registra el error completo en consola.
 * - Responde con un JSON `{ success: false, message }` usando el código de estado correcto.
 *
 * @param err - Error capturado, puede ser un Error estándar o cualquier valor lanzado
 * @param req - Objeto Request de Express
 * @param res - Objeto Response de Express
 * @param next - Función next (requerida por Express para reconocer el middleware como handler de errores)
 */
export const errorHandler = (
  err: any,
  req: Request,
  res: Response,
  next: NextFunction,
) => {
  // Si el handler anterior no cambió el statusCode, asumir error 500
  const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
  console.error(err);
  const error: ErrorResponse = {
    success: false,
    message: err.message,
  };

  if (process.env.NODE_ENV === "development") {
    return res.status(statusCode).json(error);
  }

  return res.status(statusCode).json(error);
};
