var Log = {};

var Colors = Object.freeze({
    DEFAULT: '\033[0m',
    BLACK:   '\033[30m',
    RED:     '\033[31m',
    GREEN:   '\033[32m',
    YELLOW:  '\033[33m',
    BLUE:    '\033[34m',
    MAGENTA: '\033[35m',
    CYAN:    '\033[36m',
});

var isDev = require('express')().get('env') === 'development';

var log;

if (isDev) {
    log = function(elt, color) {
        console.log(color + elt + Colors.DEFAULT);
    };
} else {
    log = function(elt, color) {
        console.log(elt);
    };
}

Log.ready = function(msg) {
    log('[RDY] ' + new Date() + ' ' + msg, Colors.GREEN);
};

Log.request = function(req, res) {
    if (req.headers['x-forwarded-for'] !== undefined || isDev) {
        log(
            '[REQ] ' + new Date() + ' ' +
                (req.headers['x-forwarded-for'] || req.connection.remoteAddress) +
                ' : ' + req.url,
            Colors.CYAN
        );
    }
};

Log.socket = {};
Log.socket.connection = function(socket) {
    log(
        '[SOK] ' + new Date() + ' ' +
        (socket.handshake.headers['x-forwarded-for'] || socket.handshake.address) + ' connection',
        Colors.MAGENTA
    );
};

Log.socket.disconnect = function(socket) {
    log(
        '[SOK] ' + new Date() + ' ' +
        (socket.handshake.headers['x-forwarded-for'] || socket.handshake.address) + ' disconnect',
        Colors.MAGENTA
    );
};

Log.dberror = function(error) {
    log(
        '[DBE] ' + new Date() + ' ' + error,
        Colors.RED
    );
};

Log.mailerror = function(error) {
    log(
        '[MLE] ' + new Date() + ' ' + error,
        Colors.RED
    );
};

if (isDev) {
    Log.debug = function(info) {
        log(
            '[DBG] ' + (info !== undefined ? info : ''),
            Colors.YELLOW
        );
    };
} else {
    Log.debug = function(){};
}

module.exports = Log;
