'use strict';

const log4js = require('log4js');

let loggerProvider = getDefaultLogProvider();

module.exports = exports = function getLogger(name) {
    return loggerProvider(name);
};

exports.setLoggerProvider = function setLoggerProvider(provider) {
    validate(typeof provider == 'function', 'Provider needs to be a function');

    const logger = provider('unleash:logger');

    validate(typeof logger.debug == 'function', 'Logger must implement debug');
    validate(typeof logger.info == 'function', 'Logger must implement info');
    validate(typeof logger.warn == 'function', 'Logger must implement warn');
    validate(typeof logger.error == 'function', 'Logger must implement error');

    loggerProvider = provider;
    logger.info('Custom Logger Provider initalized.');
};

function getDefaultLogProvider() {
    let level;
    if (process.env.NODE_ENV === 'production') {
        level = log4js.levels.ERROR;
    } else if (process.env.NODE_ENV === 'test') {
        level = log4js.levels.FATAL;
    } else {
        level = log4js.levels.DEBUG;
    }

    log4js.configure({
        appenders: {
            console: { type: 'console' },
        },
        categories: {
            default: { appenders: ['console'], level },
        },
    });

    return log4js.getLogger;
}

function validate(isValid, msg) {
    if (!isValid) {
        throw new TypeError(msg);
    }
}