import { ConfigModule, ConfigService } from '@nestjs/config';
import { LoggerModule as PinoLoggerModule } from 'nestjs-pino';
import { randomUUID } from 'crypto';

const PRETTY_TRANSPORT = {
  transport: {
    target: 'pino-pretty',
    options: {
      colorize: true,
      translateTime: 'SYS:standard',
      ignore: 'pid,hostname',
    },
  },
};

export const AppLoggerModule = PinoLoggerModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: (config: ConfigService) => {
    const nodeEnv = config.get<string>('NODE_ENV');
    const isDev = nodeEnv !== 'production';
    const level = config.get<string>('LOG_LEVEL') ?? 'info';

    return {
      pinoHttp: {
        level,
        autoLogging: false,
        redact: {
          paths: ['req', 'res'],
          remove: true,
        },
        customProps: (req) => ({
          requestId: req.id,
        }),
        genReqId: (req) => {
          const headerValue = req.headers['x-request-id'];
          if (Array.isArray(headerValue)) {
            const trimmed = headerValue[0]?.trim();
            return trimmed || randomUUID();
          }
          const trimmed = headerValue?.toString().trim();
          return trimmed || randomUUID();
        },
        ...(isDev ? PRETTY_TRANSPORT : {}),
      },
    };
  },
});
