'use strict';

var util = require('util');
var chalk = require('chalk');

var sections = [
	'API',
	'COL',
	'SYS'
];

var types = [
	'CON',
	'CHR',
	'UPD',
	'BLK',
	'TXS',
	'STA',
	'HIS',
	'PIN'
];

var typeColors = {
	'CON': chalk.reset.bold.yellow,
	'CHR': chalk.reset.bold.red,
	'UPD': chalk.reset.bold.green,
	'BLK': chalk.reset.bold.blue,
	'TXS': chalk.reset.bold.cyan,
	'STA': chalk.reset.bold.red,
	'HIS': chalk.reset.bold.magenta,
	'PIN': chalk.reset.bold.yellow,
};

var verbosity = [
	[],
	['error'],
	['error', 'warn', 'success'],
	['info', 'error', 'warn', 'success', 'time', 'timeEnd']
];

var ENV_VERBOSITY = process.env.VERBOSITY || 2;

[
	{
		name: "info",
		sign: '=i=',
		signColor: chalk.blue,
		messageColor: chalk.bold,
		formatter: function (sign, message)
		{
			return [sign, message];
		}
	},
	{
		name: "success",
		inherit: 'log',
		sign: '=✓=',
		signColor: chalk.green,
		messageColor: chalk.bold.green,
		formatter: function (sign, message)
		{
			return [sign, message];
		}
	},
	{
		name: "warn",
		sign: '=!=',
		signColor: chalk.yellow,
		messageColor: chalk.bold.yellow,
		formatter: function (sign, message)
		{
			return [sign, message];
		}
	},
	{
		name: "error",
		sign: '=✘=',
		signColor: chalk.red,
		messageColor: chalk.bold.red,
		formatter: function (sign, message)
		{
			return [sign, message];
		}
	},
	{
		name: "time",
		sign: '=T=',
		signColor: chalk.cyan,
		messageColor: chalk.bold,
		formatter: function (sign, message)
		{
			return [util.format.apply(util, [sign, message])];
		}
	},
	{
		name: "timeEnd",
		sign: '=T=',
		signColor: chalk.cyan,
		messageColor: chalk.bold,
		formatter: function (sign, message)
		{
			return [util.format.apply(util, [sign, message])];
		}
	}
].forEach( function (item)
{
	if(item.inherit !== undefined)
		console[item.name] = console[item.inherit];

	var fn = console[item.name];

	console[item.name] = function ()
	{
		if(verbosity[ENV_VERBOSITY].indexOf(item.name) === -1)
			return false;

		var args = Array.prototype.slice.call(arguments);
		var type = null,
			sign,
			time;
		var section = 'API';
		var message = '';

		if (args[0].indexOf(new Date().getFullYear()) >= 0)
		{
			time = args.splice(0, 1);
		}

		if (sections.indexOf(args[0]) >= 0)
		{
			section = args.splice(0, 1);
		}

		if (types.indexOf(args[0]) >= 0)
		{
			type = args.splice(0, 1);
		}

		sign = item.signColor.bold( '[' ) + chalk.reset.bold.white( section ) + item.signColor.bold( ']' );

		if(type !== null)
			sign = sign + " " + item.signColor.bold( '[' ) + typeColors[type](type) + item.signColor.bold( ']' );

		if(item.name !== "time" && item.name !== "timeEnd")
		{
			time = (new Date()).toJSON().replace("T", " ").replace("Z", " ");
		}
		else
		{
			time = time.toString().replace("T", " ").replace("Z", "");
		}

		sign = chalk.reset.magenta(time) + sign;

		if (typeof args[0] === 'object')
		{
			message = util.inspect( args[0], { depth: null, colors: true } );
		}
		else {
			message = item.messageColor( util.format.apply(util, args) );
		}

		return fn.apply( this, item.formatter(sign, message) );
	}
});