import winston from 'winston';
import 'winston-daily-rotate-file';
import path from 'path';

// Define log levels
const levels = {
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  debug: 4,
};

// Define log level based on environment
const level = () => {
  const env = process.env.NODE_ENV || 'development';
  return env === 'development' ? 'debug' : 'warn';
};

// Define colors for each level
const colors = {
  error: 'red',
  warn: 'yellow',
  info: 'green',
  http: 'magenta',
  debug: 'blue',
};

// Add colors to winston
winston.addColors(colors);

// Custom format for logging
const logSimpleFormat = winston.format.combine(
    winston.format.timestamp({ format: 'DD-MM-YYYY HH:mm:ss:ms' }),
    winston.format.printf(
        ({ timestamp, level, message }) => `${timestamp} [${level}] ${message}`
    )
);

// Custom format for logging
const logFormat = winston.format.combine(
    winston.format.timestamp({ format: 'DD-MM-YYYY HH:mm:ss:ms' }),
    winston.format.printf((info) => {
      const maxLevelLength = 5;                                         // "error" — самый длинный уровень
      const paddedLevel = info.level.padEnd(maxLevelLength, ' '); // Выровнять уровень
      return `[${info.timestamp}] ${paddedLevel} : ${info.message}`;
    })
);

// File transport options with uncolored plain text format
const fileRotateTransport = new winston.transports.DailyRotateFile({
  filename: path.join('logs', '%DATE%-server.log'),
  datePattern: 'DD-MM-YYYY',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d',
  level: 'info',                   // Устанавливаем уровень логирования для файла
  format: winston.format.combine(
      winston.format.uncolorize(), // Убираем цвета для файлового формата
      logFormat                    // Используем текстовый формат без JSON
  ),
});

// Create the logger
const logger = winston.createLogger({
  level: level(),
  levels,
  transports: [
    // Логи в файл
    fileRotateTransport,

    // Логи в консоль с цветами
    new winston.transports.Console({
      format: winston.format.combine(
          winston.format.colorize({ all: true }),
          logFormat
      ),
    }),
  ],
});

// Create a stream object for Morgan middleware
const stream = {
  write: (message: string) => {
    logger.http(message.trim());
  },
};

export { logger, stream };
