# Log levels for messages
LLMute=0
LLMdtry=1  # mandatory: messages that are always written to the log (except mute)
LLError=2
LLWarning=3
LLInfo=4
LLDebug=5
## Actual log level of the logger used
Log_Level=$LLInfo

## base name of the logging script.
Log_Name="${0##*/}";

## Write log of the script.
## $1 Loglevel to log the message with.
## $2 message to log.
function logger() {
	local _logging_level=$1;
	local _log_message=$2;
	if [[ $Log_Level -lt $_logging_level ]]; then
		return;
	fi
	local _now=$($DATE +%Y%m%d_%H:%M:%S);
	if [[ $_logging_level -eq $LLInfo ]]; then
		_type=" Info:";
	elif [[ $_logging_level -eq $LLError ]]; then
		_type=" ERROR!";
	elif [[ $_logging_level -eq $LLWarning ]]; then
		_type=" Warning:";
	elif [[ $_logging_level -eq $LLDebug ]]; then
		_type=" DEBUG:";
	else
		_type=":";
	fi
	printf "$Log_Name ${_now}${_type} ${_log_message}\n" >> $Log_File;
	if [[ $Log_Level -eq $LLDebug ]]; then
		printf "${_now}${_type} ${_log_message}\n";
	fi
}

function test() {
	printf "Running tests for logger().\n";
	local _exit_val=0;
	# Test log level mute: no logfile should be created!
	Log_Level=$LLMute;
	logger $LLMdtry "In level mute nothing should be logged!";
	if [ -e "$Log_File" ]; then  # the logfile should not exist!
		((_exit_val+=1))
		printf "logger() test on log level Mute: FAILED!\n";
		rm $Log_File;
	else
		printf "logger() test on log level Mute: OK.\n";
	fi

	# Test log level Mdtry, but log with level error: still no logfile should be created!
	Log_Level=$LLMdtry;
	logger $LLError "In level Mdtry an error should not be logged!";
	if [ -e "$Log_File" ]; then  # the logfile should not exist!
		((_exit_val+=1))
		printf "logger() test on log level Mandatory; logging an error happend, so test FAILED!\n";
		rm $Log_File;
	else
		printf "logger() test on log level Mandatory: when logging an error failed: test OK.\n";
	fi

	# Test log level Info, but log with level error: logfile should be created!
	Log_Level=$LLInfo;
	logger $LLError "In level Info an error should be logged!";
	if [ -e "$Log_File" ]; then  # the logfile should now exist.
		printf "logger() test on log level Info: logging an error succeeded, test OK.\n";
		rm $Log_File;
	else
		((_exit_val+=1))
		printf "logger() test on log level Info: logging an error FAILED!\n";
	fi

	# Test log level Info, but log with level debug: logfile should not be created!
	Log_Level=$LLInfo;
	logger $LLDebug "In level Info a debug message should not be logged!";
	if [ -e "$Log_File" ]; then  # the logfile should not exist.
		((_exit_val+=1))
		printf "logger() test on log level Info: logging a debug message succeeded, so test FAILED!\n";
		rm $Log_File;
	else
		printf "logger() test on log level Info: logging a debug message failed: test OK.\n";
	fi

	# Test log level Debug, but log with level debug: logfile should be created!
	Log_Level=$LLDebug;
	logger $LLDebug "In level Debug a debug message should be logged. ALso the message should appaer on std out.";
	if [ -e "$Log_File" ]; then  # the logfile should not exist.
		printf "logger() test on log level Debug: logging a debug message succeeded, so test OK.\n";
		rm $Log_File;
	else
		((_exit_val+=1))
		printf "logger() test on log level Debug: logging a debug message failed: test FAILED!\n";
	fi

	return $_exit_val;
}

DATE=$(which date);

Run_Date=$($DATE +%Y_%m_%d)
Log_File="${Run_Date}_${Log_Name}.log";

test
if [ $? -eq 0 ]; then
	printf "All test succeeded.\n";
else
	printf "$? of 5 tests FAILED!\n";
fi
