import * as winston from "winston";
import chalk from "chalk";
import { serializeError } from "serialize-error";

const customFormat = winston.format.printf(({ level, message, error, ...extraOptions }) => {
  const colorFn = (() => {
    switch (level) {
      case "error":
        return chalk.red;
      case "warn":
        return chalk.yellow;
      case "info":
        return chalk.white;
      case "debug":
        return chalk.blue;
      default:
        return chalk.white;
    }
  })();

  const levelEmoji = (() => {
    switch (level) {
      case "error":
        return "❌";
      case "warn":
        return "⚠️";
      case "info":
        return "ℹ️";
      case "debug":
        return "🐛";
      default:
        return "🔍";
    }
  })();

  return `${colorFn(`${levelEmoji} ${message}`)}${error ? `\n${chalk.red(serializeError(error))}` : ""}${extraOptions && Object.keys(extraOptions).length > 0 ? `\n${chalk.gray(JSON.stringify(extraOptions, null, 2))}` : ""}`;
});

const logger = winston.createLogger({
  level: "debug",
  format: customFormat,
  transports: [new winston.transports.Console()],
});

export default logger;
