/*
** Chat
*/

#include "config.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "mui.h"
#include <MUI/NListview_mcc.h>

#include "gui.h"
#include "msg.h"
#include "amster_Cat.h"

ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg);
char *msg_make(int d, char *nick, char *msg);


MUIF msg_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
	switch(msg->MethodID) {
		case OM_NEW: return(msg_new(cl,obj,(APTR)msg));
		case MSG_OPEN:
			set(obj,MUIA_Window_Open,TRUE);
			return(NULL);
		case MSG_GOT:
			{
			struct msgdata *data = INST_DATA(cl,obj);
			DoMethod(data->msglist,MUIM_NList_InsertSingle,(char*)((muimsg)msg)->arg1,MUIV_NList_Insert_Bottom);
			set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
			return(NULL);
			}
		case MSG_SAY:
			{
			u_long tmp;
			char *nick,*msg;
			struct msgdata *data = INST_DATA(cl,obj);
			if(!gui_napon) {
				DoMethod(data->msglist,MUIM_NList_InsertSingle,msg_make(2,NULL,"You're not connected!"),MUIV_NList_Insert_Bottom);
				set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
				return(NULL);
			}
			GetAttr(MUIA_String_Acknowledge,data->msgstr,&tmp);
			nick = strtok((char*)tmp," ");
			msg = strtok(NULL,"");
			nap_msg(nick,msg);
			DoMethod(data->msglist,MUIM_NList_InsertSingle,msg_make(1,nick,msg),MUIV_NList_Insert_Bottom);
			set(data->msglist,MUIA_NList_First,MUIV_NList_Active_Bottom);
			return(NULL);
			}
	}
	return(DoSuperMethodA(cl,obj,msg));
}


ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg)
{
	struct msgdata *data;
	Object *msglist,*msgstr;

	if (obj = (Object *)DoSuperNew(cl,obj,
		WindowContents, VGroup,
			Child, NListviewObject,
				MUIA_NListview_NList, msglist = NListObject,
					ReadListFrame,
					MUIA_NList_Input, FALSE,
					MUIA_NList_DefaultObjectOnClick, FALSE,
					MUIA_NList_ConstructHook, MUIV_NList_ConstructHook_String,
					MUIA_NList_DestructHook, MUIV_NList_DestructHook_String,
					MUIA_NList_Format, "",
					MUIA_NList_AutoCopyToClip, TRUE,
					MUIA_NList_TypeSelect, MUIV_NList_TypeSelect_Char,
					MUIA_NList_AutoVisible, TRUE,
				End,
			End,
			Child, msgstr = StringObject,
				StringFrame,
				MUIA_CycleChain, 1,
				MUIA_String_MaxLen, 256,
			End,
		End,
		TAG_MORE, msg->ops_AttrList))
	{
		data = INST_DATA(cl,obj);
		data->msglist = msglist;
		data->msgstr = msgstr;

		set(obj,MUIA_Window_ID,MAKE_ID('M','E','S','G'));
		set(obj,MUIA_Window_Title,MSG_CHAT_TITLE),

		DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,1,MSG_SAY);
		DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr);
		DoMethod(msgstr,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,msgstr,3,MUIM_Set,MUIA_String_Contents,NULL);
		DoMethod(obj,MUIM_Notify,MUIA_Window_Activate,TRUE,obj,3,MUIM_Set,MUIA_Window_ActiveObject,msgstr);
		DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,obj,3,MUIM_Set,MUIA_Window_Open,FALSE);

		return((ULONG)obj);
	}
	return(0);
}


void msg_got(char *nick, char *msg)
{
	char *tmp;

	tmp = msg_make(0,nick,msg);
	if(tmp) DoMethod(gui->mwin,MSG_GOT,tmp);
}


char *msg_make(int d, char *nick, char *msg)
{
	static char buf[1024];

	if(d==0)
		sprintf(buf,"<%s> \33b%s",nick,msg);
	else if(d==1)
		sprintf(buf,"<%s> \33i%s",nick,msg);
	else if(d==2)
		sprintf(buf,"* %s",msg);

	return(buf);
}
