import { logger } from "@/core/logger";
import { NextFunction, Request, Response } from "express";
import { ApiError } from "../api-error";

export const globalErrorHandler = async (
  error: Error,
  req: Request,
  res: Response,
  next: NextFunction
) => {
  // Si ya se envió una respuesta, delegamos al siguiente error handler
  if (res.headersSent) {
    return next(error);
  }

  logger.error(`❌ Unhandled API error: ${error.message}`);

  // Verifica si el error es una instancia de ApiError
  if (error instanceof ApiError) {
    // Respuesta con formato RFC 7807
    return res.status(error.status).json({
      type: error.type,
      title: error.title,
      status: error.status,
      detail: error.detail,
      instance: error.instance ?? req.originalUrl,
      errors: error.errors ?? [], // Aquí puedes almacenar validaciones, etc.
    });
  }

  // Si no es un ApiError, lo tratamos como un error interno (500)
  return res.status(500).json({
    type: "https://example.com/probs/internal-server-error",
    title: "Internal Server Error",
    status: 500,
    detail: error.message || "Ha ocurrido un error inesperado.",
    instance: req.originalUrl,
  });
};
