#include "WimpLib:Log.h"

#include "swis.h"
#include <stdio.h>
#include "WimpLib:File.h"
#include "WimpLib:Task.h"

#define SysLog_LogMessage 0x4c880
#define SysLog_LogData    0x4c88a

static int Logging = 0;
static int ProcLevel = 0;
static char LogBuffer[1024];
extern const char ProgramName[];

void SetLoggingOptions(int opt)
{
	Logging = opt;
}

FILE* Log_GetFile(void)
{
	snprintf(LogBuffer, sizeof(LogBuffer), "%s%c%c%cLog"
	       , Task_GetDir(), FILE_FOLDER_CHAR
           , FILE_UPFOLDER_CHAR, FILE_FOLDER_CHAR);
	FILE* file = fopen(LogBuffer, "a");

	if (file == NULL) file = fopen(LogBuffer, "w");

	if (file != NULL) setbuf(file, NULL);

	return file;
}

void Log(const char* pformat, ...)
{
	va_list arg;

	va_start(arg, pformat);
	VLog(pformat, arg);
	va_end(arg);
}

void VLog(const char* pformat, va_list arg)
{
	if (!(Logging & Log_Logging))
		return;

	if (Logging & Log_SysLog)
	{
		vsnprintf(LogBuffer, sizeof(LogBuffer), pformat, arg);
		_swix(SysLog_LogMessage, _INR(0,2), ProgramName, LogBuffer, 125);
	}
	else
	{
		FILE* file = Log_GetFile();

		if (file == NULL) return;

		vfprintf(file, pformat, arg);

		fclose(file);
	}
}

void LogBinary(const void* pdata, int len)
{
	if (!(Logging & Log_Logging))
		return;

	if (Logging & Log_SysLog)
	{
		_swix(SysLog_LogData, _INR(0,4), ProgramName, 125, pdata, len, -1);
	}
	else
	{
		FILE* file = Log_GetFile();

		if (file == NULL) return;

		fprintf(file, "Dump of %p\n", pdata);
		fwrite(pdata, len, 1, file);
		fprintf(file, "End of Dump\n");

		fclose(file);
	}
}

void Log_Enter(const char* proc)
{
	if (Logging & Log_Trace)
	{
		FILE* file = Log_GetFile();
		int i;

		if (file == NULL) return;

		for(i = 0; i < ProcLevel; i++)
			fprintf(file, "\t");
		ProcLevel++;

		fprintf(file, "%s\n", proc);

		fclose(file);
	}
}

void Log_Exit(const _kernel_oserror* err)
{
	if (Logging & Log_Trace)
	{
		FILE* file = Log_GetFile();
		int i;

		if (file == NULL) return;

		for(i = 0; i < ProcLevel; i++)
			fprintf(file, "\t");
		ProcLevel--;

		if (err)
			fprintf(file, "<-/ Error: %s\n", err->errmess);
		else
			fprintf(file, "<-/\n");

		fclose(file);
	}
}
