import * as winston from 'winston';
import 'winston-daily-rotate-file';

const isProduction = process.env.NODE_ENV === 'production';

const fileFormat = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  winston.format.errors({ stack: true }),
  winston.format.json(),
);

const consoleFormat = winston.format.combine(
  winston.format.timestamp({ format: 'HH:mm:ss' }),
  winston.format.colorize({ all: true }),
  winston.format.printf((info) => {
    const ts = (info.timestamp as string) || '';
    const ctx = info.context ? `[${info.context as string}]` : '';
    const msg = (info.message as string) || '';
    return `${ts} ${info.level} ${ctx} ${msg}`;
  }),
);

// Logs generales rotados diariamente (info+)
const appTransport = new winston.transports.DailyRotateFile({
  filename: 'logs/app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',
  maxFiles: '14d',
  level: 'info',
  format: fileFormat,
});
appTransport.setMaxListeners(50);

// Logs de error separados
const errorTransport = new winston.transports.DailyRotateFile({
  filename: 'logs/error-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',
  maxFiles: '30d',
  level: 'error',
  format: fileFormat,
});
errorTransport.setMaxListeners(50);

const transports: winston.transport[] = [appTransport, errorTransport];

if (!isProduction) {
  const consoleTransport = new winston.transports.Console({
    level: 'debug',
    format: consoleFormat,
  });
  consoleTransport.setMaxListeners(50);
  transports.push(consoleTransport);
}

export const winstonConfig: winston.LoggerOptions = {
  level: isProduction ? 'info' : 'debug',
  defaultMeta: { service: 'smartfactvoice' },
  transports,
};
