import { format, createLogger, transports } from 'winston';

const logger = createLogger({
  format: format.combine(
    format.timestamp(),
    format.json()
  ),
  transports: [
    new transports.Console()
  ]
});

// Middleware to generate a unique request ID
const requestId = (req, res, next) => {
  req.id = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
  next();
};

// Middleware to log requests
const requestLogger = (req, res, next) => {
  logger.info({
    timestamp: new Date().toISOString(),
    method: req.method,
    url: req.url,
    requestId: req.id
  });
  next();
};

// Middleware to log errors
const errorLogger = (err, req, res, next) => {
  const isSecurityEvent = err.message.includes('Authentication') || 
                         err.message.includes('Authorization') ||
                         err.message.includes('Security');
  const level = isSecurityEvent ? 'security' : 'error';
  
  logger[level]({
    timestamp: new Date().toISOString(),
    error: err.message,
    stack: err.stack,
    requestId: req.id,
    route: req.route ? req.route.path : req.path
  });
  next(err);
};

export { requestId, requestLogger, errorLogger };