#ifndef __DSLOG_H__
#define __DSLOG_H__

#pragma once

#include <stdarg.h>
#include <stdio.h>
#include <time.h>

// Log Level
#define DSLL_STATE 0x0001
#define DSLL_INFO  0x0002
#define DSLL_ERROR 0x0004
#define DSLL_DEBUG 0x0008

#define LOG(s)	(__FILE__ " : " s)

class CDSLog 
{
// Methods
public:
	CDSLog(DWORD dwMode = modeDebug, DWORD dwLevel = DSLL_STATE, LPSTR szFileName = NULL, BOOL bAppend = TRUE, BOOL bDaily = TRUE);
	virtual ~CDSLog();

	inline void Print(DWORD dwLevel, LPSTR pszFormat, ...) {
		if (!(dwLevel & m_dwLevel))
			return;

		va_list val;

		va_start(val, pszFormat);
		_Print(pszFormat, val);
		va_end(val);
	}

	void EventLog(WORD wType, LPSTR pszFormat, ...);
	void EventLogError(LPSTR pszMsg);
	void EventLogWSAError(LPSTR pszMsg);

    void SetMode(DWORD dwMode);
    void SetLevel(DWORD dwLevel);

    void SetFile(LPSTR pszFileName, BOOL bAppend = TRUE, BOOL bDaily = TRUE);

    void SetEventSource(LPSTR pszEventSource);

private:
    void _Print(LPSTR pszFormat, va_list val);
	void _PrintLine(LPSTR pszLine);
	void OpenFile();
    void CloseFile();
	void MakeSurfix(LPSTR pszBuf);

// Properties
protected:
	UINT64 m_nLastLogTime;
	CHAR   m_szLastLogDay[7];

	LPSTR  m_pszFileName;
	HANDLE m_hFile;

	LPSTR m_pszEventSource;

	BOOL  m_bDebugMode, m_bFileMode, m_bConsoleMode;
	DWORD m_dwLevel;
	BOOL  m_bAppend, m_bDaily;

public:
	static const DWORD modeDebug;
	static const DWORD modeFile;
	static const DWORD modeConsole;

	static const CHAR m_szExt[];
};

#endif