/*******************************************************************************
*                                                                              *
* Société de Transports de Montréal.                                    	   *
* 2012                                                                         *
*                                                                              *
* Projet Zones Tests                                                           *
*                                                                              *
*                                                                              *
*                                                                              *
*******************************************************************************/
/*
    Description:
    Cette classe permet de créer un fichier log très détaillé.
	CEngLog ne devrait être utilisée pour des fins de débogage par l'ingénierie
	Le log peut être activé en ajoutant la ligne ENGLOG=V dans le fichier de
	configuration de la Zone Tests (ZT.cfg) où V (verbosité) est une valeur entre
	1 et 3 qui représente le niveau de détail désiré.
*/

/* ************************************************************************** */
/* Revision:
### 20121219 JFM
    Verision d'origine.
    
### YYYYMMDD Description du besoin ou du bug
    Description du changement.
 */

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

#include "EngLog.h"
#include <QDateTime>
#include <QString>
#include "RamMonitor.h"
#include <QFileInfo>

//#include <QTextCodec>

//singleton instanciation
CEngLog CEngLog::mSingleton;

CEngLog::CEngLog():
    mEngLogFile(NULL),
    mVerbosity(3)
{
	//QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
}

CEngLog::~CEngLog()
{
    if(mEngLogFile)
        delete mEngLogFile;
}

void CEngLog::Init(unsigned int Verbosity)
{
    mVerbosity = Verbosity;
    QString FileName;
#ifndef USE_SINGLE_ENGINEERING_FILE
    FileName.sprintf("./ING/IngLog_%s_%s",QDateTime::currentDateTime().date().toString("yyyyMMdd").toAscii().data(),QDateTime::currentDateTime().time().toString("hh-mm-ss").toAscii().data());
    FileName.append(".txt");
#else
    FileName.sprintf("./ING/IngLog.txt");
#endif
    mEngLogFile = new QFile(FileName);
    if(mEngLogFile)
    {
#ifndef USE_SINGLE_ENGINEERING_FILE
		mEngLogFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Unbuffered);
#else
        QFileInfo EngLogFileInfo(*mEngLogFile);
        if(EngLogFileInfo.size() > MAX_ENGINEERING_LOG_FILESIZE)    //Make shure the file doesn't get too big
        {
            mEngLogFile->open(QIODevice::WriteOnly |QIODevice::Truncate | QIODevice::Text | QIODevice::Unbuffered);
        }
        else
        {
            mEngLogFile->open(QIODevice::WriteOnly |QIODevice::Append | QIODevice::Text | QIODevice::Unbuffered);
        }
#endif

        QString temp;
        mEngLogFile->write("\n\n");
        AddLogString(temp.sprintf("********************************************************************"),0);
        AddLogString(temp.sprintf("Zone Tests.  Fichier Log d'ingénierie"),0);
        AddLogString(temp.sprintf("Créé le %s à %s",QDateTime::currentDateTime().date().toString("yyyy-MM-dd").toAscii().data(),QDateTime::currentDateTime().time().toString("hh:mm:ss").toAscii().data()),0);
        AddLogString(temp.sprintf("Verbosité niveau %d",mVerbosity),0);
        AddLogString(temp.sprintf("********************************************************************"),0);
    }
}

void CEngLog::AddLogString(QString string, unsigned int Verbosity)
{
    if(string.isEmpty())
        return;

    qDebug("%s",string.toUtf8().data());

    if(mEngLogFile == NULL)
        return;

    if(mEngLogFile->isOpen() == false)
        return;

    if(Verbosity <= mVerbosity)
    {
        if(string.at(string.length()-1) != '\n')
            string.append('\n');

        if(string.length() > 1)
			string.prepend(QDateTime::currentDateTime().toString("yyyy/MM/dd - hh:mm:ss.zzz :     ").toAscii().data());

        mEngLogFile->write(string.toUtf8());

#ifdef LOG_RAM_USAGE
        long ram = CRamMonitor::instance()->GetRamUsage(false);
        mEngLogFile->write(QString().sprintf("Ram: %ld \n",ram).toUtf8());
#endif

    }
}

//When a buffer is already formatted, just write it to the file.
void CEngLog::WriteFormattedString(QString string)
{
    if(mEngLogFile == NULL)
        return;

    mEngLogFile->write(string.toUtf8());
    qDebug("%s",string.toUtf8().data());
}

unsigned int CEngLog::DeleteEngLogFile()
{
    if(mEngLogFile == NULL)
        return RET_ERROR;

	mEngLogFile->remove();
	delete mEngLogFile;

	mEngLogFile = new QFile("./ING/IngLog.txt");
	if(mEngLogFile)
	{
		mEngLogFile->open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text | QIODevice::Unbuffered);

		QString temp;
		mEngLogFile->write("\n\n");
		AddLogString(temp.sprintf("********************************************************************"));
		AddLogString(temp.sprintf("Zone Tests.  Fichier Log d'ingénierie (créé suite à une destruction)"),0);
		AddLogString(temp.sprintf("Créé le %s à %s",QDateTime::currentDateTime().date().toString("yyyy-MM-dd").toAscii().data(),QDateTime::currentDateTime().time().toString("hh:mm:ss").toAscii().data()),0);
		AddLogString(temp.sprintf("Verbosité niveau %d",mVerbosity),0);
		AddLogString(temp.sprintf("********************************************************************"));
	}
	mEngLogFile->flush();


	return RET_OK;
}
