// ABOUTME: Configures pino logger with console and file outputs
// ABOUTME: File logs use daily rotation with 14-day retention

import pino from 'pino';
import { createStream } from 'rotating-file-stream';
import path from 'path';
import fs from 'fs';
import config from '../config';

// Ensure logs directory exists
const logsDir = path.join(process.cwd(), 'logs');
if (!fs.existsSync(logsDir)) {
  fs.mkdirSync(logsDir, { recursive: true });
}

// Create rotating file streams
const combinedStream = createStream('combined.log', {
  interval: '1d', // Daily rotation
  maxFiles: 14,   // Keep 14 days
  path: logsDir,
  compress: 'gzip', // Compress rotated files
});

const errorStream = createStream('error.log', {
  interval: '1d',
  maxFiles: 14,
  path: logsDir,
  compress: 'gzip',
});

// Create multi-stream logger
const streams: pino.StreamEntry[] = [
  // Combined log - all levels, JSON format
  {
    level: config.logging.level,
    stream: combinedStream,
  },
  // Error log - errors only, JSON format
  {
    level: 'error',
    stream: errorStream,
  },
];

// Add console output with pretty formatting in development
if (config.env === 'development') {
  streams.push({
    level: config.logging.level,
    stream: pino.transport({
      target: 'pino-pretty',
      options: {
        colorize: true,
        translateTime: 'SYS:standard',
        ignore: 'pid,hostname',
      },
    }),
  });
} else {
  // Production: JSON to stdout for container logs
  streams.push({
    level: config.logging.level,
    stream: process.stdout,
  });
}

const logger = pino(
  {
    level: config.logging.level,
  },
  pino.multistream(streams)
);

export default logger;
