import { Request, Response, NextFunction } from 'express';
import Logger from '../resources/logger.js';

declare global {
  // eslint-disable-next-line @typescript-eslint/no-namespace
  namespace Express {
    interface Locals {
      logger: Logger;
      correlationId: string;
      requestId: string;
    }
  }
}

const ADDITIONAL_CONTEXT_HEADER = 'X-Unito-Additional-Logging-Context';

const DEBUG_HEADER = 'X-Unito-Debug';

function injectLogger(req: Request, res: Response, next: NextFunction) {
  const logger = new Logger({ correlation_id: res.locals.correlationId, request_id: res.locals.requestId });

  res.locals.logger = logger;

  if (req.header(DEBUG_HEADER)) {
    logger.setLevel('debug');
  }

  const rawAdditionalContext = req.header(ADDITIONAL_CONTEXT_HEADER);

  if (typeof rawAdditionalContext === 'string') {
    try {
      const additionalContext = JSON.parse(rawAdditionalContext);

      logger.decorate(additionalContext);
    } catch (error) {
      logger.warn(`Failed parsing header ${ADDITIONAL_CONTEXT_HEADER}: ${rawAdditionalContext}`);
    }
  }

  next();
}

export default injectLogger;
