#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <snd.h>
#include <ext2/winb.h>
#include <ext2/te.h>
#include <ext2/fntb.h>
#include <ext2/gui.h>
#include "sftlib.h"

#define INITHELP          "system\\inithp.txt"
char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/

int	DB_base = -1 ;
int	Dialog = -1 ;
int	DButton[3] = -1 ;
int	NumBox = -1 ;
int	Text = -1 ;
int	Message[6] = -1 ;
int	Icon_file = -1 ;
int	Icon_about = -1 ;
int	Alert = -1 ;
int	Message_A[2] = -1 ;
int	DButton_A[2] = -1 ;
int	Message_Sub[2] = -1 ;
int	Icon_A = -1 ;

int Alert_retcode=0;

void main(int argc, char *argv[])
{
	char	guiSndPtr[16*1024] ;	/*	SND のワークアドレス	*/
	AMI_PATH_t ps;
	char path[_MAX_PATH+1], cpath[_MAX_PATH+1];
	extern int APL_init() ;

	_getcwd( cpath, _MAX_PATH );
	AMI_pathsplit( &ps, argv[0]);
	strcpy( path, ps.drive);
	strcat( path, ps.dir);
	AMI_cd( path );

	/*	致命的エラーハンドラの登録	*/
	FM_SetVector() ;

	/*	サウンドの初期化	*/
	SND_init(guiSndPtr) ;

	/*	初期化処理	*/
	if (MMI_Open( NULL ) == NOERR)
	{
		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init() == NOERR){
			MMI_ExecSystem() ;
		}
	}

	/*	終了処理	*/
	MMI_Close() ;

	/*	サウンドの終了	*/
	SND_end() ;

	/*	致命的エラーハンドラの復帰	*/
	FM_ResetVector() ;
	AMI_pathsplit( &ps, cpath);
	strcpy( path, ps.drive);
	strcat( path, ps.dir);
	strcat( path, ps.fname);
	strcat( path, ps.ext);
	AMI_cd( path );
}

int APL_init()
{
	extern MMIINIT	initDataINIT ;
	extern MMIINIT	initDataTYPED ;
	extern MMIINIT  initDataWORK ;

	register int	ret ;

	/*	EGB ワークアドレスの取得.	*/
	guiEgbPtr = MMI_GetEgbPtr() ;

	/*	ハイパ型部品の初期化			*/
	if ((ret = MMI_initHyper()) < 0)
		return ret ;
	/*	ダイアログ型部品の初期化		*/
	if ((ret = MMI_initDialogL40()) < 0)
		return ret ;
	/*	アラート型部品の初期化			*/
	if ((ret = MMI_initAlertL40()) < 0)
		return ret ;
	/*	メッセージ型部品の初期化		*/
	if ((ret = MMI_initMessageL40()) < 0)
		return ret ;
	/*	ボタン型部品の初期化			*/
	if ((ret = MMI_initButtonL40()) < 0)
		return ret ;
	/*	ドロウボタン型部品の初期化		*/
	if ((ret = MMI_initDrawButtonL40()) < 0)
		return ret ;
	/*	アイコンボタン型部品の初期化	*/
	if ((ret = MMI_initIconL40()) < 0)
		return ret ;
	/*	スクロール型部品の初期化		*/
	if ((ret = MMI_initScrollBarL40()) < 0)
		return ret ;
	/*	テキスト型部品の初期化			*/
	if ((ret = MMI_initTextL40()) < 0)
		return ret ;
	/*	リストメニュー型部品の初期化	*/
	if ((ret = MMI_initListMenuL40()) < 0)
		return ret ;
	/*	数値入力型部品の初期化			*/
	if ((ret = MMI_initNumBoxL40()) < 0)
		return ret ;

	/*	デフォルトビジュアルイフェクトの登録	*/
	MMI_SetUpVisualEffect() ;

	/*	デフォルトサウンドイフェクトの登録		*/
	MMI_SetUpSoundEffect() ;

	/*	背景データの初期化						*/

	/*	データの登録		*/
	if ((ret = MMI_Init(&initDataINIT)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataTYPED)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataWORK)) < 0)
		return ret ;

	init_init();

	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	return NOERR ;
}

/*	initDataINIT:DButton[0]:MJ_DBUTTONL40の呼び出し関数	*/
int	help(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
    DB_typeAlertCall( "編集について",    INITHELP );
	return NOERR ;
}

/*	initDataINIT:DButton[1]:MJ_DBUTTONL40の呼び出し関数	*/
int	create(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int ret;
	char inst_path[_MAX_PATH+1];
	char buf[_MAX_PATH+1];
	char *msg[6]={
			"組み込み先のディレクトリがわかりません",
			"ディレクトリの確保に失敗しました",
			"ファイルの複写に失敗しました",
			SFTLIBDAT " を作るのに失敗しました",
			SFTLIBIND " を作るのに失敗しました",
			SFTLIBSFT " を作るのに失敗しました"};
	*inst_path=0;
	get_inst_path( inst_path ); /* 組み込み先のディレクトリ設定 */
	ret=sftlibmake(inst_path);
	if(ret){
		sprintf( buf,"return code=%d %s",ret, msg[-ret-1]);
		dispok( "処理を中断しました", buf);
	}else
	{
		strcpy(buf, inst_path);
		if( (*buf!=0) & (buf[strlen(buf)-1]!='\\') ) strcat( buf, "\\");
		strcat( buf, SFTLIBEXP );
		ret=dispalert("アイテム登録しますか", buf, "する", "しない");
		if (ret==1) {itemmit( inst_path );}
		else dispok( "Towns OS でアイテム登録をしてね", buf );
	}
	dispok("処理が終了しました",inst_path);
	return NOERR ;
}

/*	initDataINIT:DButton[2]:MJ_DBUTTONL40の呼び出し関数	*/
int	quit(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SendMessage( DB_base, MM_ERASE, 0);
	MMI_SendMessage( DB_base, MM_DETACH, 0);
	MMI_SetHaltFlag(True);	
	return NOERR ;
}

/*	initDataINIT:NumBox:MJ_NUMBOXL40の呼び出し関数	*/
int	num_F(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	return NOERR ;
}

/*	initDataINIT:Text:MJ_TEXTL40の呼び出し関数	*/
int	text_F(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	return NOERR ;
}

/*	initDataINIT:Icon_file:MJ_ICONL40の呼び出し関数	*/
int	file_btn(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char path[_MAX_PATH];
	int ret;
	int pathl;
	TEHandle *texth;

	MMI_SendMessage( Text, MM_GETTEXT, 3, path, _MAX_PATH, FALSE );
	if( strlen( path )==0 ) {strcpy( path,"\\");}
	MTL_setAtrObj( Dialog, MS_INACTIVEL40 );
	ret=AMI_FILED_getpath(path,"組み込み","設 定","やめる",DB_base);
	MTL_resetAtrObj( Dialog, (~MS_INACTIVEL40) );
	if( ret==1 ) /* 実行して終了した */
	{
		pathl=strlen(path);
		MMI_SendMessage( Text, MM_GETTEHANDLE, 1, &texth );
		MMI_SendMessage( Text, MM_SETTEXT, 3, path, pathl, FALSE);
		TE_Activate( texth, 0, 0 );
		TE_offsetJump( pathl );
		TE_UpDate();
		TE_Deactivate();
	}
	return NOERR ;
}

/*	initDataINIT:Icon_about:MJ_ICONL40の呼び出し関数	*/
int	about_btn(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	about_func();
	return NOERR ;
}

/*	initDataINIT:DButton_A[0]:MJ_DBUTTONL40の呼び出し関数	*/
int	yes_btn(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	Alert_retcode=1;
	MMI_SendMessage( Alert, MM_ERASE, 0);
	MMI_SendMessage( Alert, MM_DETACH, 0);
	MMI_SetHaltFlag(True);
	return NOERR ;
}

/*	initDataINIT:DButton_A[1]:MJ_DBUTTONL40の呼び出し関数	*/
int	no_btn(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	Alert_retcode=0;
	MMI_SendMessage( Alert, MM_ERASE, 0);
	MMI_SendMessage( Alert, MM_DETACH, 0);
	MMI_SetHaltFlag(True);
	return NOERR ;
}





/* subroutine */
int dispalert(char *s1, char *s2 , char *b1 , char *b2)
{
	MMI_SendMessage( Message_A[0], MM_SETMSG, 1, s1 );
	MMI_SendMessage( Message_A[1], MM_SETMSG, 1, s2 );
	MMI_SendMessage( Message_Sub[0], MM_SETMSG, 1, b1 );
	MMI_SendMessage( Message_Sub[1], MM_SETMSG, 1, b2 );
	MMI_SendMessage( DButton_A[1], MM_ATTACH, 1,  Alert);
	MMI_SendMessage( Message_Sub[1], MM_ATTACH, 1, Alert);
	MMI_SendMessage( Alert, MM_ATTACH, 1, DB_base);
	MMI_SendMessage( Alert, MM_SHOW, 0);
	MMI_ExecSystem();
	return Alert_retcode;
}

int dispok(char *s1, char *s2 )
{
	MMI_SendMessage( Message_A[0], MM_SETMSG, 1, s1 );
	MMI_SendMessage( Message_A[1], MM_SETMSG, 1, s2 );
	MMI_SendMessage( Message_Sub[0], MM_SETMSG, 1, "了 解" );
	MMI_SendMessage( DButton_A[1], MM_DETACH, 0 );
	MMI_SendMessage( Message_Sub[1], MM_DETACH, 0 );
	MMI_SendMessage( Alert, MM_ATTACH, 1, DB_base);
	MMI_SendMessage( Alert, MM_SHOW, 0);
	MMI_ExecSystem();
	return Alert_retcode;
}


int get_inst_path( char *inst_path ) /* 組み込み先のディレクトリ設定 */
{
	MMI_SendMessage( Text, MM_GETTEXT, 3, inst_path, _MAX_PATH, FALSE );
	inst_path[_MAX_PATH]=0;
	return 0;
}

int get_inst_number( int *num )
{
	int ret;
	int min, max, d, p;
	ret=MMI_SendMessage( NumBox, MM_GETNUMBOX, 5, num, &min, &max, &d, &p );
	return 0;
}


int init_init()
{
	char *p="A:\\SFTLIB";
	MMI_SendMessage( Text, MM_SETTEXT, 3, p, strlen(p)+1, FALSE );
	MMI_SendMessage( NumBox, MM_SETNUMBOX, 5, 200, 1, 100000, 1, 0 );
	return 0;
}
