<?php

// Run configuration
define('LOG_WRITE_CURRENT_FILE', 'ManiaControl.log'); // Write current log to extra file in base dir
define('LOG_NAME_USE_DATE', true); // Use current date as suffix for log file name in logs folder
define('LOG_NAME_USE_PID', true); // Use current process id as suffix for log file name in logs folder
                                  
// Define base dir
define('ManiaControlDir', __DIR__);

// Set process settings
ini_set('memory_limit', '64M');
if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set')) {
	date_default_timezone_set(@date_default_timezone_get());
}

// Build log file name
$logFileName = ManiaControlDir . '/logs/';
if (!is_dir($logFileName)) {
	mkdir($logFileName);
}
$logFileName .= '/ManiaControl';
if (LOG_NAME_USE_DATE) $logFileName .= '_' . date('Y-m-d');
if (LOG_NAME_USE_PID) $logFileName .= '_' . getmypid();
$logFileName .= '.log';
define('LOG_FILE', $logFileName);

// Delete old current log file
if (LOG_WRITE_CURRENT_FILE) {
	$currentLogFileName = ManiaControlDir . '/' . LOG_WRITE_CURRENT_FILE;
	if (file_exists($currentLogFileName) && is_writable($currentLogFileName)) {
		unlink($currentLogFileName);
	}
	define('LOG_CURRENT_FILE', $currentLogFileName);
}

// Log function
function logMessage($message) {
	$message .= PHP_EOL;
	if (defined('LOG_CURRENT_FILE')) file_put_contents(LOG_CURRENT_FILE, $message, FILE_APPEND);
	file_put_contents(LOG_FILE, $message, FILE_APPEND);
	echo $message;
}

// Error level parse function
function getErrorTag($errorLevel) {
	if ($errorLevel == E_NOTICE) {
		return '[PHP NOTICE]';
	}
	if ($errorLevel == E_WARNING) {
		return '[PHP WARNING]';
	}
	if ($errorLevel == E_ERROR) {
		return '[PHP ERROR]';
	}
	if ($errorLevel == E_USER_NOTICE) {
		return '[ManiaControl NOTICE]';
	}
	if ($errorLevel == E_USER_WARNING) {
		return '[ManiaControl WARNING]';
	}
	if ($errorLevel == E_USER_ERROR) {
		return '[ManiaControl ERROR]';
	}
	return "[PHP {$errorLevel}]";
}

// Register error handler
set_error_handler(
		function ($errorNumber, $errorString, $errorFile, $errorLine) {
			if (error_reporting() == 0) {
				// Error suppressed
				return false;
			}
			// Log error
			$errorTag = getErrorTag($errorNumber);
			$message = "{$errorTag}: {$errorString} in File '{$errorFile}' on Line {$errorLine}!";
			logMessage($message);
			if ($errorNumber == E_ERROR || $errorNumber == E_USER_ERROR) {
				logMessage('Stopping execution...');
				exit();
			}
			return false;
		}, -1);

// Start ManiaControl
require_once __DIR__ . '/core/ManiaControl.php';
$maniaControl = new ManiaControl\ManiaControl();
$maniaControl->run();