/*********************************************************************

Name:		Raytracer
Author:		Kamil Szatkowski "Netrix" (C)
Website:	http://www.netrix.org.pl/
License:	GNU GPL

*********************************************************************/
#include "../nLogger.hpp"
#include "../nAssert.hpp"
#include <time.h>
#include <stdarg.h>
#include <stdio.h>
#include <cwchar>	// for linux

#pragma warning(disable: 4996)

namespace
{
	FILE* g_pFile;
	bool g_bPrint;
}

namespace NIne
{
	/***********************************************************************/
	NLogger::NLogger()
	{
		g_pFile = null;
	}
	/***********************************************************************/
	NLogger::~NLogger()
	{
		Release();
	}
	/***********************************************************************/
	NRESULT NLogger::InitLogger(const char* szFilepath, bool bPrint)
	{
		if(g_pFile != null)		// Logger already created
		{
			return NRV_SUCCESS;
		}
		
		g_bPrint = bPrint;
		g_pFile = fopen(szFilepath, "w");
		if(g_pFile == null)
		{
			return NRV_FAILED_TO_OPEN_FILE;
		}

		LogMessage("%s\n", szFilepath);

		return NRV_SUCCESS;
	}
	/***********************************************************************/
	void NLogger::Release()
	{
		if(g_pFile != null)
		{
			fclose(g_pFile);
			g_pFile = null;
		}
	}
	/***********************************************************************/
	void NLogger::LogMessage(const char* szFormat, ...)
	{
		if(g_pFile != null)
		{
			time_t rawTime;		// Time-stamp
			time(&rawTime);
			
			tm* pTs = localtime(&rawTime);
			
			char szBuffer[32];
			strftime(szBuffer, sizeof(szBuffer), "[ %H:%M:%S %d-%m-%Y ] ", pTs);

			// Writing timestamp
			fprintf(g_pFile, "%s", szBuffer);
			if(g_bPrint) { printf("%s", szBuffer); }

			va_list argptr;
			va_start(argptr, szFormat);

			// Writing message
			vfprintf(g_pFile, szFormat, argptr);
			if(g_bPrint) { vprintf(szFormat, argptr); }

			va_end(argptr);
					
			fflush(g_pFile);
		}
	}
	/***********************************************************************/
	void NLogger::LogMessage(const wchar_t* szFormat, ...)
	{
		if(g_pFile != null)
		{
			time_t rawTime;		// Time-stamp
			time(&rawTime);
			
			tm* pTs = localtime(&rawTime);
			
			wchar_t szBuffer[32];
			wcsftime(szBuffer, sizeof(szBuffer), L"[ %H:%M:%S %d-%m-%Y ] ", pTs);

			fwprintf(g_pFile, L"%s", szBuffer);	// Writing timestamp
			if(g_bPrint) { wprintf(L"%s", szBuffer); }

			va_list argptr;
			va_start(argptr, szFormat);

			vfwprintf(g_pFile, szFormat, argptr);	// Writing message
			if(g_bPrint) { vwprintf(szFormat, argptr); }

			va_end(argptr);
					
			fwprintf(g_pFile, L"\n");
			fflush(g_pFile);
		}
	}
	/***********************************************************************/
	void NLogger::LogAppend(const char* szFormat, ...)
	{
		if(g_pFile != null)
		{
			// Writing message
			va_list argptr;
			va_start(argptr, szFormat);
			vfprintf(g_pFile, szFormat, argptr);
			if(g_bPrint) { vprintf(szFormat, argptr); }

			va_end(argptr);
					
			fflush(g_pFile);
		}
	}
	/***********************************************************************/
	void NLogger::LogAppend(const wchar_t* szFormat, ...)
	{
		if(g_pFile != null)
		{
			va_list argptr;
			va_start(argptr, szFormat);
			vfwprintf(g_pFile, szFormat, argptr);	// Writing message
			if(g_bPrint) { vwprintf(szFormat, argptr); }

			va_end(argptr);
					
			fwprintf(g_pFile, L"\n");
			fflush(g_pFile);
		}
	}
}