/**
@file main.cpp
@brief font2textureのすべての処理
@note
<h2>CSVデータの記述の仕方</h2?
@code
フォント名,1文字の横,文字の太さ(0 ~ 9),描画のタイプ (0 ~ 4)
@endcode

*/
#define BOOST_ENABLE_ASSERT_HANDLER//assertion_failed

#include <dxex/manager.hpp>
//#include <dxex/dxexlib.hpp>
#include <dkutil/gui/select.hpp>
#include <dkutil/parser/csv.hpp>
#include <dkutil/filesystem/std_filestream.hpp>

namespace boost{
	void assertion_failed(char const * expr, char const * function, char const * file, long line){
		dkcErrorMessage(expr, file,line,function);
	}
}

using namespace dxex;
using namespace dkutil;

bool isDrawOKChar(BYTE c){
	if(c >= 0x21 && 0x7E <= c){
		return true;
	}
	return false;
}


// WinMain 関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			 LPSTR lpCmdLine, int nCmdShow )
{
	/*dkutil::dODS("a2 = %d",GetAngle2(0,0,50,50));
	dkutil::dODS("a1 = %d",GetAngle(0,0,50,50));
	return 0;*/
	int r = edk_FAILED;

	DxLibManager mgr;

	char filename[MAX_PATH + 1024]="";
	char savename[MAX_PATH + 1024]="";
	{
	
		bool re = FileOpenDialog(filename,sizeof(filename),"設定ファイルを選択してください。",
			"csv(*.csv)\0*.csv\0All files(*.*)\0*.*\0\0",NULL,NULL);
		if(false==re){
			return r;
		}
	}

	std_filestream stream;
	stream.reset(filename,read_mode | text_mode);
	stream.open();
	char buff[2048]="";
	stream.all_read(buff,sizeof(buff));

	CSVParser par;
	par.reset(buff);
	if(par.empty()){
		return r;
	}
	if(par.size() < 4){
		return r;
	}
	if(IDYES==MessageBox(NULL,"スペースを取り除きますか？","message",MB_YESNO))
	{
		par.space_erase();
	}

	{

		bool re = FileSaveDialog(savename,sizeof(savename),"保存するファイル名を!!!",
			"bmp(*.bmp)\0*.bmp\0\0",NULL,NULL);
		if(false==re){
			return r;
		}
	}

	


	if(false==mgr.reset()){
		return r;
	}
	int white = GetColor(255,255,255);
	
	int string_width;
	
	{

		CSVParser::const_iterator it = par.begin();

		std::string  rstr = (*it).str;
		//const std::string rstr = (*it).str;
		if(-1==ChangeFont( (*it).str.c_str() )){
			dMB("%d フォントを設定できませんでした。",(*it).str.c_str());

			goto End;
		}
		it++;
		rstr = (*it).str;

		int t = atoi((*it).str.c_str());
		string_width = t;

		if(0 != 	SetFontSize(t)){
			dMB("SetFontSizeが失敗");
			goto End;
		}
		it++;
		rstr = (*it).str;
		t = atoi((*it).str.c_str());
		if(0 != SetFontThickness(t)){
			dMB("SetFontThickness失敗");
			goto End;
		}
		it++;


		/*
		DX_FONTTYPE_NORMAL　　　　　　: ノーマルフォント
	　DX_FONTTYPE_EDGE　　　　　　　: エッジつきフォント
	　DX_FONTTYPE_ANTIALIASING　　　: アンチエイリアスフォント
	　DX_FONTTYPE_ANTIALIASING_EDGE
		*/
		rstr = (*it).str;
		t = atoi((*it).str.c_str());

		if(0 != ChangeFontType(t)){
			dMB("ChangeFontType失敗");
			goto End;
		}
	}


	{
		std::string str;
		{
			int i;
			for(i=0x21;i<0x7E;i++){
				//if(isVisible(i)){
				//if(isDrawOKChar(i)){
					str += (char)i;
				//}
			}
		}

		//key_wrap
		for(;;){

			mgr.Update();
			mgr.screen_clear();
			if(mgr.isEnd()){
				break;
			}
			if(mgr.keyState(KEY_INPUT_ESCAPE)){
				break;
			}
			


			std::string::iterator it;
			int ww = 512 / string_width;
			int wc = 0,hc = 0;
			for(it =  str.begin();it != str.end();it++)
			{
				if(wc >= ww){
					wc = 0;
					hc ++;
				}
				BYTE st[2]={(BYTE)(*it),'\0'};
				//int width = GetDrawStringWidth(st,1);
				DrawString(wc * string_width,hc * string_width,(char *)st,white);
				wc++;
			}
			Sleep(30);

			static bool succeeded = false;
			if(succeeded==false){
				if(true==mgr.saveScreen(savename)){
					succeeded = true;
					
				}else{
					int id = MessageBox(NULL,"なんか上手く保存できなかったけど、もう一回TRY?","HOGE",MB_YESNO);
					if(id==IDNO){
						break;
					}
				}
			}
						



			
			
			mgr.screen_flip();
			//WaitKey();



			
		}//end of loop
	}

End:

	mgr.clear();

	r = edk_SUCCEEDED;
	return r;
Error:
	mgr.screen_flip();
	WaitKey();
	goto End;
}