import type { FastifyError, FastifyInstance } from 'fastify'
import { ZodError } from 'zod'
import { AppError } from '../../../domain/errors/app-error'

export function registerErrorHandler(server: FastifyInstance): void {
  server.setErrorHandler((err: FastifyError, _request, reply) => {
    if (err instanceof AppError) {
      return reply.status(err.httpStatus).send({
        error: { code: err.code, message: err.message },
      })
    }

    if (err instanceof ZodError) {
      const details = err.issues.map((i) => ({
        path: i.path.join('.'),
        message: i.message,
      }))
      return reply.status(400).send({
        error: { code: 'VALIDATION_ERROR', message: 'Datos de entrada inválidos', details },
      })
    }

    // Errores 4xx propios de Fastify (e.g., ruta no encontrada, método no permitido)
    if (err.statusCode !== undefined && err.statusCode < 500) {
      return reply.status(err.statusCode).send({
        error: { code: 'REQUEST_ERROR', message: err.message },
      })
    }

    server.log.error({ err }, 'Error no controlado')
    return reply.status(500).send({
      error: { code: 'INTERNAL_ERROR', message: 'Error interno del servidor' },
    })
  })
}
