import winston from 'winston';
import { ConsoleTransport } from './transports/ConsoleTransport';
import { FileTransport } from './transports/FileTransport';

interface LoggerOptions {
  logLevel: 'info' | 'warn' | 'error' | 'debug';
  logToFile: boolean;
  filePath?: string;
}

export class Logger {
  private logger: winston.Logger;

  constructor(options: LoggerOptions) {
    const transports: winston.transport[] = [new ConsoleTransport(options.logLevel)];

    if (options.logToFile && options.filePath) {
      transports.push(new FileTransport(options.filePath, options.logLevel));
    }

    this.logger = winston.createLogger({
      level: options.logLevel,
      transports,
    });
  }

  log(level: 'info' | 'warn' | 'error' | 'debug', message: string) {
    this.logger.log(level, message);
  }

  info(message: string) {
    this.log('info', message);
  }

  warn(message: string) {
    this.log('warn', message);
  }

  error(message: string) {
    this.log('error', message);
  }

  debug(message: string) {
    this.log('debug', message);
  }
}
