import { randomUUID } from 'crypto'
import { createLogger, format, transports } from 'winston'
import { NextFunction, Request, Response } from 'express'
import util from 'util'

const logLevels = {
  fatal: 0,
  error: 1,
  warn: 2,
  info: 3,
  debug: 4,
  trace: 5,
};


export const logger = createLogger({
    format: format.combine(format.timestamp(), format.json()),
    transports: [new transports.Console({}), new transports.File({ filename: './serverLog.log' })],
    levels: logLevels
  });

export const errorHandler = (err: Error, req: Request, res: Response, next: NextFunction) => {
    if (res.headersSent) {
      return next(err)
    }

    res.status(500).send({ status: 'error', message: err.message, code: res.locals.uuid })
    logger.warn({
      message: err.message,
      endpoint: req.originalUrl,
      reqId: res.locals.uuid,
      origin: req.headers.origin,
    })
  }

export const uuid = (req: Request, res: Response, next: NextFunction) => {
  res.locals.uuid = randomUUID()
  next()
}