/*
  A simple logging helper that uses the `pino` logging system. Pino is actually
  not very good but it works well enough.  My main complaint is it seems Pino's
  speed comes from doing _zero_ string interpolation on its own.  You have to
  craft all of the strings yourself, which is probably the majority of the processing
  time in logging, so Pino is effectively "cheating" by claiming it's fast but
  not doing anything.  If you ever want to beat Pino just don't log anything too.
  Fastest log is no logs at all.
 */
import pino from 'pino';
import pinoPretty from 'pino-pretty';
import path from 'path';

const log_level = process.env.PROD === undefined ? "debug" : "info";

/*
  Base log connector using `pino` logging.  You can use this but
  it's probably better to use the `create` method below so you can
  specify the file this log came from.
 */
export const log = pino({
  level: log_level,
  prettyPrint: {
    levelFirst: true,
    colorize: true,
    singleLine: true,
    ignore: "module",
    messageFormat: "{levelLabel}[{pid}] {module}: {msg}"
  },
  prettifier: pinoPretty
});

/*
  This will create a `pino` logger with the name of the file in the log messages. Incredibly
  useful when you're trying to find out where something happened.  To make this work you need
  to do the following:

  ```javascript
  const log = logging.create(import.meta.url);
  ```

  The `import.meta.url` is how you get a the current file in ESM style modules.  In older
  `node` you'd use so the called "magic" variable `__file`.  I guess if you put `__` in a
  variable name it's considered magic, but if you attach `meta.url` to a keyword like `import`
  and then also make that keyword a function magically then it's definitely not magic and
  suprior to a simple variable everyone knows.
 */
export const create = (import_url) => {
  const pd = path.parse(import_url);
  const log_line = `${path.basename(pd.dir)}/${pd.base}`;
  return log.child({module: log_line});
}

export default { create, log };
