import { NextFunction, Request, Response } from "express";
import { ApiErrorContext, ApiErrorMapper, toProblemJson } from "../api-error-mapper";

// ✅ Construye tu mapper una vez (composition root del adaptador HTTP)
export const apiErrorMapper = ApiErrorMapper.default();

export const globalErrorHandler = async (
  error: Error,
  req: Request,
  res: Response,
  next: NextFunction
) => {
  console.error(`❌ Global unhandled error: ${error.message}`);

  // Si ya se envió una respuesta, delegamos al siguiente error handler
  if (res.headersSent) {
    return next(error);
  }
  const ctx = {
    instance: req.originalUrl,
    correlationId: req.get("x-correlation-id") || undefined,
    method: req.method,
  } satisfies ApiErrorContext;

  const apiError = apiErrorMapper.map(error, ctx);
  const body = toProblemJson(apiError, ctx);

  // 👇 Log interno con cause/traza (no lo exponemos al cliente)
  // logger.error({ err, cause: (err as any)?.cause, ...ctx }, `❌ Unhandled API error: ${error.message}`);

  res.status(apiError.status).json(body);
};
