import { Request, Response, NextFunction } from 'express';
import logger from '../utils/logger';

const requestLogger = (req: Request, res: Response, next: NextFunction): void => {
  const startedAt = process.hrtime.bigint();

  res.on('finish', () => {
    const durationMs = Math.round(Number(process.hrtime.bigint() - startedAt) / 1e5) / 10;
    const status = res.statusCode;

    const actor = req.admin
      ? { actor_type: 'admin', actor_id: req.admin.id, actor_role: req.admin.role }
      : req.user
        ? { actor_type: 'user', actor_id: req.user.id, actor_role: req.user.role }
        : { actor_type: 'anonymous' };

    const meta = {
      method: req.method,
      path: req.originalUrl,
      status,
      duration_ms: durationMs,
      ip: req.ip,
      ...actor,
    };

    const message = `${req.method} ${req.originalUrl} ${status} ${durationMs}ms`;

    if (status >= 500) {
      logger.error(message, meta);
    } else if (status >= 400) {
      logger.warn(message, meta);
    } else {
      logger.info(message, meta);
    }
  });

  next();
};

export default requestLogger;
