import pino from 'pino';
import { globalRedactor } from './redactor.js';

export interface CreateLoggerOptions {
  level?: string;
  name?: string;
  pretty?: boolean;
}

export function createZyphonLogger(options: CreateLoggerOptions = {}) {
  const level = options.level ?? process.env.LOG_LEVEL ?? 'info';

  return pino({
    name: options.name ?? 'zyphon',
    level,
    timestamp: pino.stdTimeFunctions.isoTime,
    formatters: {
      log(object) {
        return globalRedactor.redact(object) as Record<string, unknown>;
      },
    },
    serializers: {
      req(req) {
        return {
          id: req.id,
          method: req.method,
          url: req.url,
          headers: globalRedactor.redact(req.headers),
          remoteAddress: req.socket?.remoteAddress,
        };
      },
      res(res) {
        return {
          statusCode: res.statusCode,
          headers: globalRedactor.redact(res.getHeaders?.() ?? {}),
        };
      },
      err(err) {
        return globalRedactor.redact(err);
      },
    },
  });
}

export type ZyphonLogger = ReturnType<typeof createZyphonLogger>;

