/* eslint-disable consistent-return */
import { NextFunction, Request, Response } from "express";
import pino from "pino";
import * as pretty from "pino-pretty";

const levels = {
  http: 10,
  debug: 20,
  info: 30,
  warn: 40,
  error: 50,
  fatal: 60,
};

const stream = pretty.default({
  colorize: true,
  translateTime: "SYS:yyyy-mm-dd HH:MM:ss.l",
  levelFirst: true,
});

export const logger = pino(
  {
    customLevels: levels,
    useOnlyCustomLevels: true,
    level: "http",
  },
  stream
);

export const loggerMiddleware = (
  req: Request,
  res: Response,
  next: NextFunction
): void => {
  const msg = {
    url: req.url,
    method: req.method,
    body: req.body as unknown,
    params: req.params,
    query: req.query,
  };

  const IS_PROD_MODE = process.env.NODE_ENV === "production";

  if (!IS_PROD_MODE) {
    logger.info(JSON.stringify(msg));
  } else {
    logger.info(msg, "request completed");
  }
  next();
};
