

#ifndef _dkutilLog__h__
#define _dkutilLog__h__

#include "dkutilCompileOption.h"

#ifdef USE_DKINGYO_INCLUDE_SETTING_LIKE_BOOST
#	if !defined(__GNUG__)
#		include <dkutil/dktl/array_onebyone.h>
#	endif
#	include <dkutil/dkutilGetParam.h>
#else
#	if DKUTIL_COMPILE_OPTION_MSVC
#		include "dktl/array_onebyone.h"
#		include "dkutilGetParam.h"
#	else
#		include "array_onebyone.h"
#		include "dkutilGetParam.h"
#	endif
#endif


namespace dkutil{


//extern bool dInitLog( const char *filename );

//extern bool dAddLog( const char *filename,const char *str , ... );


///エラーログ(ファイル)を初期化する @param filename[in] ファイルの名前
inline bool dInitLog( const char *filename )
{
	FILE *fp;
	// エラーログファイルを開く(初期化)
	if(NULL==(fp = fopen( filename , "wt" ))){
		return false;
	}
	fclose( fp ) ;
	
	return true;
}
///ログを吐く @param filename[in] ファイルネーム @param str[in] 吐く文字列
inline bool dAddLog( const char *filename,const char *str , ... ){
	FILE *fp=NULL;
	char s[2048]="";
	SET_VA_LIST_INSERT_YEN_N(s,2048,str);
	
	//ファイルをオープン
	if(NULL == (fp = fopen( filename , "at" )))
		return false;
	// エラーログファイルに書き出す
	fputs( s , fp ) ;
	fclose( fp ) ;
	return true;
}



class HTMLLog{
protected:
	std::string m_name;
	int m_exSize;

	/**	ログ開始
		ログ出力の開始処理をします。
	*/
	bool LogoutStart(char *titlename)
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return false;

		fprintf( fp,
			"<HTML>\n"
			"<HEAD>\n"
			"<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n"
			"<TITLE>%s</TITLE>\n"
			"<STYLE type=\"text/css\">\n"
			"<!--\n"
			"BODY{\n"
			"  font-size : 12px;\n"
			"  font-family : \"ＭＳ ゴシック\";\n"
			"}\n"
			"-->\n"
			"</STYLE>\n"
			"</HEAD>\n"
			"<BODY bgcolor=\"#ffffff\" text=\"#000000\" link=\"#444444\" vlink=\"#444444\" alink=\"#444444\">\n",
			titlename );

		fclose( fp );
		return true;
	}

	/**	ログ終了
		ログ出力の終了処理をします。
	*/

	bool LogoutEnd()
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return false;

		fprintf( fp,
			"</BODY>\n"
			"</HTML>\n" );

		fclose( fp );
		return true;
	}

public:
	///@param logfiletitle[in] HTMLログファイルのタイトルを指定してください。
	///@param fullpathname[in] ファイルパスはフルパス指定で御願いします。
	HTMLLog(char *logfiletitle="DebugLog",char *fullpathname = "debuglog.html")
	{
		m_name = fullpathname;
		m_exSize = MAX_PATH;
		LogoutStart(logfiletitle);
	}
	virtual ~HTMLLog()
	{
		LogoutEnd();
	}
	//各、拡張可能引数の文字列をどうするか。（まだ実装してない。
	void SetExtensionStringSize(int size){
		m_exSize = size;
	}

	///@param name[in] ファイル名は振るパス指定で御願いします。
	void SetLogFileName(char *name){		m_name = name;	}
	char *GetLogFileName(){return const_cast<char *>(m_name.c_str());}

	/**	ログ出力カテゴリー
		ログ出力をカテゴリー用の色で処理をします。

		@param pStr		[in] 描画文字列（printf()と同様の書式）
	*/
	void LogoutMainCategory( char *pStr )
	{


		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;

		fprintf( fp,
			"<TABLE width=\"100%%\" bgcolor=\"#000000\">\n"
			"  <TBODY>\n"
			"    <TR>\n"
			"      <TD align=\"center\">\n"
			"        <B>\n"
			"          <FONT color=\"WHITE\">" );

		vfprintf( fp, pStr, (char*)(&pStr + 1) );

		fprintf( fp,
			"</FONT>\n"
			"        </B>\n"
			"      </TD>\n"
			"    </TR>\n"
			"  </TBODY>\n"
			"</TABLE>\n" );

		fclose( fp );
	}
	/**	ログ出力キーワード
		ログ出力をキーワード用の色で処理をします。

		@param pStr		[in] 描画文字列（printf()と同様の書式）
	*/
	void LogoutKeyword( char *pStr,... )
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;

		fprintf( fp, "<B><FONT color=\"BLUE\">" );
		vfprintf( fp, pStr, (char*)(&pStr + 1) );
		fprintf( fp, "</FONT></B>" );

		fclose( fp );
	}
	/**	ログ出力エラー
		ログ出力をエラー用の色で処理をします。

		@param pStr		[in] 描画文字列（printf()と同様の書式）
	*/
	void LogoutError( char *pStr,... )
	{
		
		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;
		//bool f;
		//char *str;
		//BEGIN_GET_MANY_ARG(f,str,m_exSize,pStr);
		//if(f==false) return;
		fprintf( fp, "<B><FONT color=\"RED\">" );
		//fprintf( fp, str);
		vfprintf( fp, pStr, (char*)(&pStr + 1) );
		fprintf( fp, "</FONT></B>" );
		//END_GET_MANY_ARG(str);
		fclose( fp );
	}

	/**	ログ出力ＯＫ
		ログ出力をＯＫ用の色で処理をします。

		@param pStr		[in] 描画文字列（printf()と同様の書式）
	*/
	void LogoutOK( char *pStr,... )
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;

		fprintf( fp, "<B><FONT color=\"GREEN\">" );
		vfprintf( fp, pStr, (char*)(&pStr + 1) );
		fprintf( fp, "</FONT></B>" );

		fclose( fp );
	}

	/**	ログ出力太字
		ログ出力を太字で行います。
		@param pStr		[in] 描画文字列（printf()と同様の書式）
	*/
	void LogoutStrong( char *pStr,... )
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;

		fprintf( fp, "<B>" );
		vfprintf( fp, pStr, (char*)(&pStr + 1) );
		fprintf( fp, "</B>" );

		fclose( fp );
	}

	/*!	ログ出力<BR>
		ログ出力をします。

		@param pStr		[in] 描画文字列（printf()と同様の書式）
	*/
	void Logout( char *pStr,... )
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;

		vfprintf( fp, pStr, (char*)(&pStr + 1) );

		fclose( fp );
	}
	/*!	ログ改行<BR>
		ログ出力の改行処理をします。
	*/
	void LogoutNextLine( void )
	{

		FILE *fp = fopen( GetLogFileName(), "at" );
		if ( fp == NULL ) return;

		fprintf( fp, "<BR>\n" );

		fclose( fp );
	}

};
#if !defined(__GNUG__)
class HTMLLogFactory{
public:
	typedef array_onebyone_ex<HTMLLog> CONTAINER_TYPE;
	typedef CONTAINER_TYPE::handle handle;
	typedef CONTAINER_TYPE::size_type size_type;
	typedef CONTAINER_TYPE::reference reference_type;
protected:
	CONTAINER_TYPE m_c;
public:
	HTMLLogFactory(){}
	virtual ~HTMLLogFactory(){}
	handle Construct(char *title,char *filefullpath){ 
		return m_c.push(HTMLLog(title,filefullpath));
	}
	void Destroy(handle h){
		m_c.pop(h);
	}
	HTMLLog &Reference(handle h){
		return m_c.at(h);
	}
	size_type size(){	return m_c.size();}
};
#endif

//extern void HTMLLogTest();

/*	
inline bool GetVersionInfoForProgrammer(std::string &s){
	char buff[1024]="";
	GetVersionInfo v;

	const int num = 
	const char *dllname[num]={
		"KERNEL32.DLL",
		"AVIFIL32.DLL",
		"MSVFW32.DLL",
		"COMCTL32.DLL",
		"MSVCRT.dll",
		"OLEPRO32.dll",
		"OLEAUT32.dll",
		"MSHTML.dll",
	}
	s += 

}
*/

}//end of dkutil namespace

#endif //end of include once

	
