/*
 * Copyright (c) 2022.
 * Author Peter Placzek (tada5hi)
 * For the full copyright and license information,
 * view the LICENSE file that was distributed with this source code.
 */

import {createLogger, transports, format, Logger} from 'winston';
import {getWritableDirPath} from "../../config/paths";

let logger : undefined | any;

/*
Levels
{
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6
}
 */

const includeNamespaceInMessage = format((info, opts) => {
    if(typeof info.meta?.namespace === 'string') {
        info.message = `${info.namespace}: ${info.message}`;
    }

    return info;
});

export function useLogger() : Logger {
    if(typeof logger !== 'undefined') {
        return logger;
    }

    logger = createLogger({
        format: format.combine(
            includeNamespaceInMessage(),
            format.colorize(),
            format.json(),
            format.timestamp()
        ),
        level: 'debug',
        transports: [
            new transports.Console({
                level: 'debug'
            }),
            new transports.File({
                filename: getWritableDirPath() + '/error.log',
                level: 'warn',
            })
        ]
    })

    return logger;
}
