/*
	Copyright 2004-2005 Electronic Arts Inc.
*/

#include "GameTalkLog.hpp"

namespace EA
{	
namespace GameTalk
{

Log* Log::mInstance = NULL;

Log* Log::GetInstance()
{
	if (NULL == mInstance)
	{
		mInstance = new Log();
	}
	return mInstance;
}

void Log::DestroyInstance()
{
	if (mInstance != NULL)
	{
		delete mInstance;
		mInstance = NULL;
	}
}

Log::Log()
{
	InitVars();
	Init();
} 

Log::~Log()
{
	if (logLevel < QUIET_MODE)
	{
		clear(ios::goodbit);
		*this << endl;
		PrintHeader(1);    // add ending time to log file
	}
	close();
}

void Log::Init(const string& fileName)
{
	if ((fileName.c_str())[0])
		OpenLog(fileName, LOG_WRITE);
	else
		OpenLog("gametalklog.txt", LOG_WRITE);
}

void Log::Init(const string& fileName, int mode)
{
	if ((fileName.c_str())[0])
		OpenLog(fileName,mode);
	else
		OpenLog("gametalklog.txt", mode);
}

void Log::Init()
{
	OpenLog("gametalklog.txt", LOG_WRITE);
}

void Log::OpenLog(const string& fileName, int mode)
{
	if (logLevel < QUIET_MODE)
	{
		open(fileName.c_str(),mode);

		if (fail() == 0)
		{
			logName = fileName;
			PrintHeader(0);         // insert start time into top of log file
		}
		else
		{
			cout << "ERROR: Log file " << fileName.c_str() 
				<< " could not be opened for write access." << endl;
			logLevel = QUIET_MODE;
		}
	}
	else
	{
		cout << "Logging disabled (QUIET_MODE set)" << endl;
	}
}

void Log::InitVars()
{
	time(&startTime);
	logLevel = Log::LEVEL_1;
}

void Log::PrintHeader(int theEnd)
{
	if (logLevel < QUIET_MODE)
	{
		clear(ios::goodbit);

		// setup time
		time_t sttime;
		time(&sttime);

		// convert to gm time
		struct tm *tim = gmtime(&sttime);

		// set data items
		int sec  = tim->tm_sec;           // second (0-61, allows for leap seconds)
		int min  = tim->tm_min;           // minute (0-59)
		int hour = tim->tm_hour;          // hour (0-23)

		int mon  = tim->tm_mon + 1;       // month (0-11)
		int mday = tim->tm_mday;          // day of the month (1-31)
		int year = tim->tm_year % 100;    // years since 1900

		char cur_time[9];
		char cur_date[9];

		sprintf(cur_time,"%02d:%02d:%02d",hour,min,sec);
		sprintf(cur_date,"%02d/%02d/%02d",mon,mday,year);

		char line_2[61];
		sprintf(line_2,"DATE: %s - %s%30s",cur_date,cur_time,logName.c_str());
		*this << line_2 << endl << endl;

		if (theEnd) *this << GetExecTime() << endl;
	}   
} 

void Log::GetExecTime(int* min, int* sec)
{
	time_t endTime;
	time(&endTime);
	*min = (int)((endTime - startTime)/60);
	*sec = (int)((endTime - startTime)%60);
} 

char *Log::GetExecTime()
{
	int min = 0;
	int sec = 0;
	GetExecTime(&min, &sec);
	static char execTime[128];
	sprintf(execTime, "Execution time: %d minutes %d seconds", min, sec);
	return execTime;
}

} // namespace GameTalk
} // namespace EA
