var express = require('express');
var http = require('http');
var yargs = require('yargs');

var argv = yargs.argv;

var log = {};

var Color = {
    DEFAULT:0,
    BLACK:1,
    RED:2,
    GREEN:3,
    YELLOW:4,
    BLUE:5,
    MAGENTA:6,
    CYAN:7,
    ORANGE:8
}

function getColorCode(c) {
    switch (c) {
        case Color.DEFAULT: return '\u001b[0m';
        case Color.BLACK:   return '\u001b[30m';
        case Color.RED:     return '\u001b[31m';
        case Color.GREEN:   return '\u001b[32m';
        case Color.YELLOW:  return '\u001b[33m';
        case Color.BLUE:    return '\u001b[34m';
        case Color.MAGENTA: return '\u001b[35m';
        case Color.CYAN:    return '\u001b[36m';
        case Color.ORANGE:  return '\u001b[38;5;202m';
    }
}

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

var write;

if (argv.nolisten || argv.n) {
    write = function(elt, color) { }
} else if (isDev) {
    write = function(elt, color) {
        console.log(getColorCode(color) + elt + getColorCode(Color.DEFAULT));
    }
} else {
    write = function(elt, color) {
        console.log(elt);
    }
}

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

log.request = function(req, res, time) {

    if (req.headers['x-forwarded-for'] !== undefined || isDev) {

        var isStatic = req.url.substr(0, 7) === '/static' || req.url === '/favicon.ico';

        write(
            '[REQ] ' + new Date() + ' ' +
                (req.headers['x-forwarded-for'] || req.connection.remoteAddress) +
                (time !== undefined ? (' in ' + ("      " + time).slice(-6) + ' ms') : '') +
                ' : ' + (isStatic && req.url !== '/favicon.ico' ? '/static' + req.url : req.url),
            isStatic ? Color.YELLOW : Color.CYAN
        );
    }

}

log.socket = {};

log.socket.connection = function(socket, isTest) {
    write(
        '[SOK] ' + new Date() + ' ' +
        (socket.handshake.headers['x-forwarded-for'] || socket.handshake.address) + (isTest ? ' test' : '') + ' connection',
        Color.MAGENTA
     );
}

log.socket.disconnect = function(socket, isTest) {
    write(
        '[SOK] ' + new Date() + ' ' +
            (socket.handshake.headers['x-forwarded-for'] || socket.handshake.address) + (isTest ? ' test' : '') + ' disconnect',
        Color.MAGENTA
    );
}

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

log.prefetcherror = function(error) {
    write(
        '[PFE] ' + new Date() + ' ' + error,
        Color.RED
    );
}

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

log.debug = function(info, force) {
    if (isDev || force === true) {
        write(
            '[DBG] ' + (info !== undefined ? info : ''),
            Color.YELLOW
        );
    }
}

log.pugerror = function(error) {
    write(
        '[PER] ' + new Date() + ' ' + error,
        Color.RED
    );
}

log.warning = function(message) {

    write(
        '[WRN] ' + new Date() + ' ' + message,
        Color.ORANGE
    );

}

log.faceerror = function(message) {

    write(
        '[FER] ' + new Date() + ' ' + message,
        Color.RED
    );

}

module.exports = log;
