import { logToDb } from "../db";

function safeStringify(obj: unknown) {
  const seen = new WeakSet();

  return JSON.stringify(obj, (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) {
        return "[Circular]";
      }
      seen.add(value);
    }

    if (typeof value === "function") {
      return `[Function: ${value.name || "anonymous"}]`;
    }

    return value;
  });
}

export const logger = {
  log: (message: string, ...args: unknown[]) => {
    if (process.env.NODE_ENV !== "production") {
      // eslint-disable-next-line no-console
      console.log(message, ...args);
      const argsString = args.length > 0 ? " - " + safeStringify(args) : "";
      logToDb(message + argsString);
    }
  },
  warn: (message: string, ...args: unknown[]) => {
    if (process.env.NODE_ENV !== "production") {
      // eslint-disable-next-line no-console
      console.warn(message, ...args);
      const argsString = args.length > 0 ? " - " + safeStringify(args) : "";
      logToDb(message + argsString);
    }
  },
  error: (message: string, ...args: unknown[]) => {
    // Errors will always be logged
    // eslint-disable-next-line no-console
    console.error(message, ...args);
    const argsString = args.length > 0 ? " - " + safeStringify(args) : "";
    logToDb(message + argsString);
  },
};
