'use strict';

const dir = `${__dirname}/../../log`;
const fs = require('fs');
const config = require('config');
//const Discord = require("discord.js");
let client;
let utils;

if (!config.isDocker && !fs.existsSync(`${dir}`)) {
	fs.mkdirSync(dir);
}

let started;
let success = 0;
let successThisMinute = 0;
let successThisHour = 0;
let error = 0;
let errorThisMinute = 0;
let errorThisHour = 0;
let info = 0;
let infoThisMinute = 0;
let infoThisHour = 0;

let successUnitsPerMinute = [0,0,0,0,0,0,0,0,0,0];
let errorUnitsPerMinute = [0,0,0,0,0,0,0,0,0,0];
let infoUnitsPerMinute = [0,0,0,0,0,0,0,0,0,0];

let successUnitsPerHour = [0,0,0,0,0,0,0,0,0,0];
let errorUnitsPerHour = [0,0,0,0,0,0,0,0,0,0];
let infoUnitsPerHour = [0,0,0,0,0,0,0,0,0,0];

function calculateUnits(units, unit) {
	units.push(unit);
	if (units.length > 10) units.shift();
	return units;
}

function calculateHourUnits() {
	successUnitsPerHour = calculateUnits(successUnitsPerHour, successThisHour);
	errorUnitsPerHour = calculateUnits(errorUnitsPerHour, errorThisHour);
	infoUnitsPerHour = calculateUnits(infoUnitsPerHour, infoThisHour);

	successThisHour = 0;
	errorThisHour = 0;
	infoThisHour = 0;

	utils.emitToRoom('admin.statistics', 'event:admin.statistics.success.units.hour', successUnitsPerHour);
	utils.emitToRoom('admin.statistics', 'event:admin.statistics.error.units.hour', errorUnitsPerHour);
	utils.emitToRoom('admin.statistics', 'event:admin.statistics.info.units.hour', infoUnitsPerHour);

	setTimeout(calculateHourUnits, 1000 * 60 * 60)
}

function calculateMinuteUnits() {
	successUnitsPerMinute = calculateUnits(successUnitsPerMinute, successThisMinute);
	errorUnitsPerMinute = calculateUnits(errorUnitsPerMinute, errorThisMinute);
	infoUnitsPerMinute = calculateUnits(infoUnitsPerMinute, infoThisMinute);

	successThisMinute = 0;
	errorThisMinute = 0;
	infoThisMinute = 0;

	utils.emitToRoom('admin.statistics', 'event:admin.statistics.success.units.minute', successUnitsPerMinute);
	utils.emitToRoom('admin.statistics', 'event:admin.statistics.error.units.minute', errorUnitsPerMinute);
	utils.emitToRoom('admin.statistics', 'event:admin.statistics.info.units.minute', infoUnitsPerMinute);
	
	setTimeout(calculateMinuteUnits, 1000 * 60)
}

let twoDigits = (num) => {
	return (num < 10) ? '0' + num : num;
};

let getTime = () => {
	let time = new Date();
	return {
		year: time.getFullYear(),
		month: time.getMonth() + 1,
		day: time.getDate(),
		hour: time.getHours(),
		minute: time.getMinutes(),
		second: time.getSeconds()
	}
};

let getTimeFormatted = () => {
	let time = getTime();
	return `${time.year}-${twoDigits(time.month)}-${twoDigits(time.day)} ${twoDigits(time.hour)}:${twoDigits(time.minute)}:${twoDigits(time.second)}`;
}

let initialized = false;
let lockdown = false;

module.exports = {
	init: function(cb) {
		utils = require('./utils');
		started = Date.now();

		setTimeout(calculateMinuteUnits, 1000 * 60);
		setTimeout(calculateHourUnits, 1000 * 60 * 60);
		setTimeout(this.calculate, 1000 * 30);

		let time = getTimeFormatted();
		fs.appendFile(dir + '/all.log', `${time} BACKEND_RESTARTED\n`, ()=>{});
		fs.appendFile(dir + '/success.log', `${time} BACKEND_RESTARTED\n`, ()=>{});
		fs.appendFile(dir + '/error.log', `${time} BACKEND_RESTARTED\n`, ()=>{});
		fs.appendFile(dir + '/info.log', `${time} BACKEND_RESTARTED\n`, ()=>{});
		fs.appendFile(dir + '/debugStation.log', `${time} BACKEND_RESTARTED\n`, ()=>{});

		initialized = true;

		if (lockdown) return this._lockdown();
		cb();
	},
	success: (type, message, display = true) => {
		if (lockdown) return;
		success++;
		successThisMinute++;
		successThisHour++;
		let time = getTimeFormatted();
		fs.appendFile(dir + '/all.log', `${time} SUCCESS - ${type} - ${message}\n`, ()=>{});
		fs.appendFile(dir + '/success.log', `${time} SUCCESS - ${type} - ${message}\n`, ()=>{});
		if (display) console.info('\x1b[32m', time, 'SUCCESS', '-', type, '-', message, '\x1b[0m');
	},
	error: (type, message, display = true) => {
		if (lockdown) return;
		error++;
		errorThisMinute++;
		errorThisHour++;
		let time = getTimeFormatted();
		fs.appendFile(dir + '/all.log', `${time} ERROR - ${type} - ${message}\n`, ()=>{});
		fs.appendFile(dir + '/error.log', `${time} ERROR - ${type} - ${message}\n`, ()=>{});
		if (display) console.warn('\x1b[31m', time, 'ERROR', '-', type, '-', message, '\x1b[0m');
	},
	info: (type, message, display = true) => {
		if (lockdown) return;
		info++;
		infoThisMinute++;
		infoThisHour++;
		let time = getTimeFormatted();
		fs.appendFile(dir + '/all.log', `${time} INFO - ${type} - ${message}\n`, ()=>{});
		fs.appendFile(dir + '/info.log', `${time} INFO - ${type} - ${message}\n`, ()=>{});
		if (display) console.info('\x1b[36m', time, 'INFO', '-', type, '-', message, '\x1b[0m');
	},
	stationIssue: (string, display = false) => {
		if (lockdown) return;
		let time = getTimeFormatted();
		fs.appendFile(dir + '/debugStation.log', `${time} - ${string}\n`, ()=>{});
		if (display) console.info('\x1b[35m', time, '-', string, '\x1b[0m');
	},
	calculatePerSecond: function(number) {
		if (lockdown) return;
		let secondsRunning = Math.floor((Date.now() - started) / 1000);
		let perSecond = number / secondsRunning;
		return perSecond;
	},
	calculatePerMinute: function(number) {
		if (lockdown) return;
		let perMinute = this.calculatePerSecond(number) * 60;
		return perMinute;
	},
	calculatePerHour: function(number) {
		if (lockdown) return;
		let perHour = this.calculatePerMinute(number) * 60;
		return perHour;
	},
	calculatePerDay: function(number) {
		if (lockdown) return;
		let perDay = this.calculatePerHour(number) * 24;
		return perDay;
	},
	calculate: function() {
		if (lockdown) return;
		let _this = module.exports;
		utils.emitToRoom('admin.statistics', 'event:admin.statistics.logs', {
			second: {
				success: _this.calculatePerSecond(success),
				error: _this.calculatePerSecond(error),
				info: _this.calculatePerSecond(info)
			},
			minute: {
				success: _this.calculatePerMinute(success),
				error: _this.calculatePerMinute(error),
				info: _this.calculatePerMinute(info)
			},
			hour: {
				success: _this.calculatePerHour(success),
				error: _this.calculatePerHour(error),
				info: _this.calculatePerHour(info)
			},
			day: {
				success: _this.calculatePerDay(success),
				error: _this.calculatePerDay(error),
				info: _this.calculatePerDay(info)
			}
		});
		setTimeout(_this.calculate, 1000 * 30);
	},

	_lockdown: () => {
		lockdown = true;
	}
};