#pragma once
#include "ThreadSkeleton.h"
#include "Settings.h"
#include "IServerTool.h"
#include "ILogManager.h"

/*!
	ログエントリ
*/
class CLogManagerEntry
{
public:
	CLogManagerEntry() {};
	CLogManagerEntry(CString filePath, CString log)
	{
		m_filePath = filePath;
		m_log = log;
	};

	//!	ファイル名
	CString	m_filePath;

	//!	ログ
	CString	m_log;
};

//!	ログエントリリスト
typedef	CList<CLogManagerEntry>	CLogManagerEntryList;


/*!
	アクセスログマネージャ

	ログキャッシュ機能を提供する
*/
class CLogManager : protected CThreadSkeleton, protected ILogManager
{
public:
	CLogManager(void);
	virtual ~CLogManager(void);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(IServerToolPtr serverTool);

	//!	停止
	void Stop();

	//!	アクセスログ出力
	void WriteAccessLog(CString filePath, CString log);

	//!	インタフェース取得
	virtual ILogManagerPtr GetILogManager() { return ILogManagerRet(this, FALSE); };

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	スレッド関数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	スレッド
	void ThreadMain();

	//!	ログ出力
	void FlashLog();

	//!	ログをファイルへ
	void WriteLogs(FILE *log, CString filePath);

	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	初期化フラグ
	CInterlockCounter			m_init;

	//!	サーバツール
	IServerToolPtr				m_serverTool;

	//!	設定
	CLogManagerSetting			m_setting;

	//!	ログ
	CLogManagerEntryList		m_logList;

	//!	インターバル時間
	int							m_intervalTime;

	//!	前回作成したディレクトリ
	CString						m_oldDir;
};
