import logger from './logger.js';
import objection from 'objection';
import * as Sentry from './sentry.ee.js';
const { NotFoundError, DataError } = objection;

// Do not remove `next` argument as the function signature will not fit for an error handler middleware
// eslint-disable-next-line no-unused-vars
const errorHandler = (error, request, response, next) => {
  if (error.message === 'Not Found' || error instanceof NotFoundError) {
    response.status(404).end();
  }

  if (notFoundAppError(error)) {
    response.status(404).end();
  }

  if (error instanceof DataError) {
    response.status(400).end();
  }

  const statusCode = error.statusCode || 500;

  logger.error(request.method + ' ' + request.url + ' ' + statusCode);
  logger.error(error.stack);

  Sentry.captureException(error, {
    tags: { rest: true },
    extra: {
      url: request?.url,
      method: request?.method,
      params: request?.params,
    },
  });

  response.status(statusCode).end();
};

const notFoundAppError = (error) => {
  return (
    error.message.includes('An application with the') ||
    error.message.includes("key couldn't be found.")
  );
};

export default errorHandler;
