/*
** Preferences
*/

#include "include/config.h"

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

#include "include/mui.h"
#include <mui/NListview_mcc.h>
#include <libraries/asl.h>

#include "include/gui.h"
#include "include/search.h"
#include "include/panel.h"
#include "include/prefs.h"
#include "include/info.h"
#include "amster_Cat.h"

struct prefsdata myprefs;
struct prefsdata *prf = &myprefs;

int prf_eventflags[] = { 2,0,2,2,2,2,1 };

ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg);
void prf_set(struct prfdata *data);
void prf_use(struct prfdata *data);
void snd_play(char *fname);
void prf_entry(struct prfdata *data);


MUIF prf_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
	struct prfdata *data = INST_DATA(cl,obj);

	switch(msg->MethodID) {
		case OM_NEW: return(prf_new(cl,obj,(APTR)msg));
		case PRF_UPDATE:
			if(gui_napon) nap_sendbuf(NAPC_EMAILCHANGE,prf->email);
			else MUI_Request(gui->app, gui->swin, 0L, (char *)MSG_ERROR_TITLE, (char *)MSG_OK_GAD, (char *)MSG_ERROR_UPDATEEMAIL);
			return(NULL);
		case PRF_OPEN:
			prf_set(data);
			set(obj,MUIA_Window_Open,TRUE);
			return(NULL);
		case PRF_USE:
			prf_use(data);
			set(obj,MUIA_Window_Open,FALSE);
			return(NULL);
		case PRF_SAVE:
			prf_use(data);
			set(obj,MUIA_Window_Open,FALSE);
			prf_save("ENVARC:"AMSTER_PREFS);
			return(NULL);
		case PRF_SAVEALL:
			{
			u_long tmp;
			GetAttr(MUIA_Window_Open,obj,&tmp);
			if(tmp==TRUE) {
				prf_use(data);
				set(obj,MUIA_Window_Open,FALSE);
			}
			prf_save("ENVARC:"AMSTER_PREFS);
			return(NULL);
			}
		case PRF_CANCEL:
			set(obj,MUIA_Window_Open,FALSE);
			return(NULL);
		case PRF_TESTSND:
			{
			u_long tmp;
			GetAttr(MUIA_String_Acknowledge,data->evtsound,&tmp);
			if (((char *)tmp)[0]!=0) snd_play((char *)tmp);
			return(NULL);
			}
		case PRF_FIREWALL:
			{
			u_long tmp;
			GetAttr(MUIA_Selected,data->firetog,&tmp);
			if(tmp==TRUE)
				set(data->pstr,MUIA_Disabled,TRUE);
			else
				set(data->pstr,MUIA_Disabled,FALSE);

			return(NULL);
			}
		case PRF_ENTRY:
			prf_entry(data);
			return(NULL);
	}
	return(DoSuperMethodA(cl,obj,msg));
}


ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg)
{
	static char *pages[] = {
		(char *)_MSG_PRF_USER_TAB,
		(char *)_MSG_PRF_OPTIONS_TAB,
		(char *)_MSG_PRF_EVENTS_TAB,
		(char *)_MSG_PRF_ADVANCED_TAB,
		NULL
	};
	static char *events[] = {
		(char *)_MSG_PRF_EVT_START,
		(char *)_MSG_PRF_EVT_EXIT,
		(char *)_MSG_PRF_EVT_CONN,
		(char *)_MSG_PRF_EVT_DISC,
		(char *)_MSG_PRF_EVT_DLFIN,
		(char *)_MSG_PRF_EVT_DLERR,
		(char *)_MSG_PRF_EVT_PLAY,
		NULL
	};
	struct prfdata *data;
	Object *idstr,*pwstr,*emailstr,*emailbut,*pathstr,*links;
	Object *clrtog,*autotog,*fptog;
	Object *evtlist,*evtscript,*evtsound,*evttestbut;
	Object *msstr,*sstr,*vstr,*pstr,*firetog;
	Object *savbut,*usebut,*canbut;

	if(pages[0] == (char *)_MSG_PRF_USER_TAB)
		localize_array(pages);
	if(events[0] == (char *)_MSG_PRF_EVT_START)
		localize_array(events);

	if (obj = (Object *)DoSuperNew(cl,obj,
		MUIA_HelpNode, "config",
		MUIA_Window_Title, MSG_PRF_TITLE,
		MUIA_Window_ID, MAKE_ID('S','E','T','T'),
		WindowContents, VGroup,
			Child, RegisterGroup(pages),
			Child, ColGroup(2),
				MUIA_HelpNode, "conf-user",
				Child, Label2(MSG_PRF_USERNAME),
				Child, idstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
				End,
				Child, Label2(MSG_PRF_PASSWORD),
				Child, pwstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_String_Secret, TRUE,
					MUIA_CycleChain, 1,
				End,
				Child, Label2(MSG_PRF_EMAIL),
				Child, HGroup,
					Child, emailstr = StringObject,
						StringFrame,
						MUIA_String_AdvanceOnCR, TRUE,
						MUIA_CycleChain, 1,
					End,
					Child, emailbut = SimpleButton(MSG_PRF_UPDATE_GAD),
				End,
				Child, Label2(MSG_PRF_CONNECTION),
				Child, links = CycleObject,
					MUIA_Cycle_Active, prf->link,
					MUIA_Cycle_Entries, nap_linktype,
				End,
				Child, Label2(MSG_PRF_DLPATH),
				Child, pathstr = PopaslObject,
					MUIA_Popstring_String, StringObject,
						StringFrame,
						MUIA_String_MaxLen, 256,
						MUIA_CycleChain, 1,
					End,
					MUIA_Popstring_Button, PopButton(MUII_PopFile),
					MUIA_Popasl_Type, ASL_FileRequest,
					ASLFR_TitleText, MSG_PRF_DLPATH_REQ,
					ASLFR_DrawersOnly, TRUE,
				End,
			End,
			Child, ColGroup(2),
				MUIA_HelpNode, "conf-opts",
				Child, clrtog = ImageObject,
					MUIA_HorizWeight, 10,
					ButtonFrame,
					MUIA_Background, MUII_ButtonBack,
					MUIA_InputMode, MUIV_InputMode_Toggle,
					MUIA_ShowSelState, FALSE,
					MUIA_CycleChain, 1,
					MUIA_Image_Spec, "6:15",
				End,
				Child, TextObject,
					MUIA_HorizWeight, 90,
					MUIA_Text_Contents, MSG_PRF_CLEARLIST,
				End,
				Child, autotog = ImageObject,
					MUIA_HorizWeight, 10,
					ButtonFrame,
					MUIA_Background, MUII_ButtonBack,
					MUIA_InputMode, MUIV_InputMode_Toggle,
					MUIA_ShowSelState, FALSE,
					MUIA_CycleChain, 1,
					MUIA_Image_Spec, "6:15",
				End,
				Child, TextObject,
					MUIA_HorizWeight, 90,
					MUIA_Text_Contents, MSG_PRF_AUTOCONNECT,
				End,
				Child, fptog = ImageObject,
					MUIA_HorizWeight, 10,
					ButtonFrame,
					MUIA_Background, MUII_ButtonBack,
					MUIA_InputMode, MUIV_InputMode_Toggle,
					MUIA_ShowSelState, FALSE,
					MUIA_CycleChain, 1,
					MUIA_Image_Spec, "6:15",
				End,
				Child, TextObject,
					MUIA_HorizWeight, 90,
					MUIA_Text_Contents, MSG_PRF_FULLPATHS,
				End,
			End,
			Child, VGroup,
				MUIA_HelpNode, "conf-events",
				Child, NListviewObject,
					MUIA_NListview_NList, evtlist = NListObject,
						InputListFrame,
						MUIA_NList_SourceArray, events,
					End,
				End,
				Child, ColGroup(2),
					Child, Label2(MSG_PRF_SCRIPT),
					Child, evtscript = PopaslObject,
						MUIA_Popstring_String, StringObject,
							StringFrame,
							MUIA_String_MaxLen, 256,
							MUIA_CycleChain, 1,
						End,
						MUIA_Popstring_Button, PopButton(MUII_PopFile),
						MUIA_Popasl_Type, ASL_FileRequest,
						ASLFR_TitleText, MSG_PRF_SCRIPT_REQ,
					End,
					Child, Label2(MSG_PRF_SOUND),
					Child, HGroup,
						Child, evtsound = PopaslObject,
							MUIA_HorizWeight, 300,
							MUIA_Popstring_String, StringObject,
								StringFrame,
								MUIA_String_MaxLen, 256,
								MUIA_CycleChain, 1,
							End,
							MUIA_Popstring_Button, PopButton(MUII_PopFile),
							MUIA_Popasl_Type, ASL_FileRequest,
							ASLFR_TitleText, MSG_PRF_SOUND_REQ,
						End,
						Child, evttestbut = SimpleButton(MSG_PRF_SOUNDTEST_GAD),
					End,
				End,
			End,
			Child, ColGroup(2),
				MUIA_HelpNode, "conf-adv",
				Child, Label2(MSG_PRF_MAINSERVER),
				Child, msstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
					MUIA_ShortHelp, MSG_PRF_MAINSERVER_HELP,
				End,
				Child, Label2(MSG_PRF_MP3SERVER),
				Child, sstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
					MUIA_ShortHelp, MSG_PRF_MP3SERVER_HELP,
				End,
				Child, Label2(MSG_PRF_VERSION),
				Child, vstr = StringObject,
					StringFrame,
					MUIA_CycleChain, 1,
				End,
				Child, Label2(MSG_PRF_LISTENPORT),
				Child, HGroup,
					Child, pstr = StringObject,
						StringFrame,
						MUIA_HorizWeight, 90,
						MUIA_String_Integer, prf->port,
						MUIA_String_Accept, "0123456789",
						MUIA_String_MaxLen, 6,
						MUIA_CycleChain, 1,
					End,
					Child, Label2(MSG_PRF_BEHINDFW),
					Child, firetog = ImageObject,
						ButtonFrame,
						MUIA_HorizWeight, 10,
						MUIA_Background, MUII_ButtonBack,
						MUIA_InputMode, MUIV_InputMode_Toggle,
						MUIA_ShowSelState, FALSE,
						MUIA_Image_Spec, "6:15",
						MUIA_Selected, FALSE,
					End,
				End,
			End,
			End,
			Child, HGroup,
				Child, savbut = SimpleButton(MSG_PRF_SAVE_GAD),
				Child, usebut = SimpleButton(MSG_PRF_USE_GAD),
				Child, canbut = SimpleButton(MSG_PRF_CANCEL_GAD),
			End,

		End,
		TAG_MORE, msg->ops_AttrList))
	{
		data = INST_DATA(cl,obj);
		data->idstr = idstr;
		data->pwstr = pwstr;
		data->emailstr = emailstr;
		data->pathstr = pathstr;
		data->links = links;
		data->clrtog = clrtog;
		data->autotog = autotog;
		data->fptog = fptog;
		data->evtlist = evtlist;
		data->evtscript = evtscript;
		data->evtsound = evtsound;
		data->msstr = msstr;
		data->sstr = sstr;
		data->vstr = vstr;
		data->pstr = pstr;
		data->firetog = firetog;
		data->lastitem = -1;

		DoMethod(emailbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,PRF_UPDATE);
		DoMethod(evtlist,MUIM_Notify,MUIA_NList_EntryClick,MUIV_EveryTime,obj,1,PRF_ENTRY);
		DoMethod(evttestbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,PRF_TESTSND);
		DoMethod(firetog,MUIM_Notify,MUIA_Selected,MUIV_EveryTime,obj,1,PRF_FIREWALL);

		DoMethod(canbut,MUIM_Notify,MUIA_Pressed,FALSE,gui->iconpanel,2,PANEL_CLOSEPRF,PRF_CANCEL);
		DoMethod(usebut,MUIM_Notify,MUIA_Pressed,FALSE,gui->iconpanel,2,PANEL_CLOSEPRF,PRF_USE);
		DoMethod(savbut,MUIM_Notify,MUIA_Pressed,FALSE,gui->iconpanel,2,PANEL_CLOSEPRF,PRF_SAVE);
		DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,gui->iconpanel,2,PANEL_CLOSEPRF,PRF_CANCEL);

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


void prf_set(struct prfdata *data)
{
	set(data->idstr,MUIA_String_Contents,prf->user);
	set(data->pwstr,MUIA_String_Contents,prf->pass);
	set(data->emailstr,MUIA_String_Contents,prf->email);
	set(data->pathstr,MUIA_String_Contents,prf->dlpath);
	set(data->links,MUIA_Cycle_Active,prf->link);
	set(data->clrtog,MUIA_Selected,prf->clrlist);
	set(data->autotog,MUIA_Selected,prf->autocon);
	set(data->fptog,MUIA_Selected,prf->fullpath);

	set(data->msstr,MUIA_String_Contents,prf->mainserver);
	set(data->sstr,MUIA_String_Contents,prf->server);
	set(data->vstr,MUIA_String_Contents,prf->napvers);

	set(data->pstr,MUIA_String_Integer,prf->port);
	if(prf->port)
		set(data->firetog,MUIA_Selected,FALSE);
	else {
		set(data->firetog,MUIA_Selected,TRUE);
		set(data->pstr,MUIA_String_Integer,5555);
	}
}


void prf_use(struct prfdata *data)
{
	u_long tmp,tmp2;
	int oldfp;

	GetAttr(MUIA_String_Acknowledge,data->msstr,&tmp);
	if (((char*)tmp)[0]==0) prf->mainserver=NULL; else prf->mainserver=strdup((char*)tmp);

	GetAttr(MUIA_String_Acknowledge,data->sstr,&tmp);
	if (((char*)tmp)[0]==0) prf->server=NULL; else prf->server=strdup((char*)tmp);

	GetAttr(MUIA_String_Acknowledge,data->vstr,&tmp);
	if (((char*)tmp)[0]==0) prf->napvers=NULL; else prf->napvers=strdup((char*)tmp);

	GetAttr(MUIA_Selected,data->firetog,&tmp);
	if(!tmp) {
		GetAttr(MUIA_String_Integer,data->pstr,&tmp);
		prf->port = (int)tmp;
	} else {
		prf->port = 0;
	}

	GetAttr(MUIA_String_Acknowledge,data->idstr,&tmp);
	if (((char*)tmp)[0]==0) prf->user=NULL; else prf->user=strdup((char*)tmp);

	GetAttr(MUIA_String_Acknowledge,data->pwstr,&tmp);
	if (((char*)tmp)[0]==0) prf->pass=NULL; else prf->pass=strdup((char*)tmp);

	GetAttr(MUIA_String_Acknowledge,data->emailstr,&tmp);
	if (((char*)tmp)[0]==0) prf->email=NULL; else prf->email=strdup((char*)tmp);

	GetAttr(MUIA_String_Acknowledge,data->pathstr,&tmp);
	if (((char*)tmp)[0]==0) prf->dlpath=NULL; else prf->dlpath=strdup((char*)tmp);

	GetAttr(MUIA_Cycle_Active,data->links,&tmp);
	prf->link = tmp;

	GetAttr(MUIA_Selected,data->clrtog,&tmp);
	prf->clrlist = tmp;

	GetAttr(MUIA_Selected,data->autotog,&tmp);
	prf->autocon = tmp;

	GetAttr(MUIA_NList_Active,data->evtlist,&tmp);
	if(tmp != MUIV_NList_Active_Off) {
		if(prf_eventflags[tmp]&1) {
			GetAttr(MUIA_String_Contents,data->evtscript,&tmp2);
			if(((char*)tmp2)[0]==0) prf->scripts[tmp]=NULL; else prf->scripts[tmp]=strdup((char*)tmp2);
		}
		if(prf_eventflags[tmp]&2) {
			GetAttr(MUIA_String_Contents,data->evtsound,&tmp2);
			if(((char*)tmp2)[0]==0) prf->sounds[tmp]=NULL; else prf->sounds[tmp]=strdup((char*)tmp2);
		}
	}

	oldfp = prf->fullpath;
	GetAttr(MUIA_Selected,data->fptog,&tmp);
	prf->fullpath = tmp;
	if(prf->fullpath!=oldfp) DoMethod(gui->searchpanel,SEARCH_REFRESH);

	prf_save("ENV:"AMSTER_PREFS);
}


void prf_setup(int argc, char *argv[])
{
	memset(prf,0,sizeof(struct prefsdata));

	/* defaults */
	prf->mainserver = "server.napster.com:8875";
	prf->napvers = "Amster 0.5";
	prf->port = 5555;
	prf->email = "anon@napster.com";
	prf->dlpath = "RAM:";
	prf->link = 3;
	prf->regflag = 1;	/*  >:)  */

}


void prf_load(void)
{
	FILE *f;
	char tmp[100],*s;
	int i;

	f=fopen("ENV:"AMSTER_PREFS,"r");
	if(f==0) f=fopen("ENVARC:"AMSTER_PREFS,"r");
	if(f==0) return;

	while(fgets(tmp,sizeof(tmp),f)) {
		s = strtok(tmp," ");
		if(!s) {
			continue;
		} else if(strcmp(s,"<search>")==0) {
			DoMethod(gui->searchpanel,SEARCH_LOADPRF,f);
		} else if(strcmp(s,"noiconpanel")==0) {
			prf->noiconpanel = 1;
		} else if(strcmp(s,"mainserver")==0) {
			if(s=strtok(NULL,"\n")) prf->mainserver=strdup(s);
		} else if(strcmp(s,"server")==0) {
			if(s=strtok(NULL,"\n")) prf->server=strdup(s);
		} else if(strcmp(s,"napvers")==0) {
			if(s=strtok(NULL,"\n")) prf->napvers=strdup(s);
		} else if(strcmp(s,"listport")==0) {
			if(s=strtok(NULL,"\n")) prf->port=atoi(s);

		} else if(strcmp(s,"script")==0) {
			if(s=strtok(NULL," ")) {
				i = atoi(s);
				if(i>0 && i<8 && (s=strtok(NULL,"\n")))
					prf->scripts[i-1] = strdup(s);
			}

		} else if(strcmp(s,"sound")==0) {
			if(s=strtok(NULL," ")) {
				i = atoi(s);
				if(i>0 && i<8 && (s=strtok(NULL,"\n")))
					prf->sounds[i-1] = strdup(s);
			}

		} else if(strcmp(s,"user")==0) {
			if(s=strtok(NULL,"\n")) prf->user=strdup(s);
		} else if(strcmp(s,"pass")==0) {
			if(s=strtok(NULL,"\n")) prf->pass=strdup(s);
		} else if(strcmp(s,"email")==0) {
			if(s=strtok(NULL,"\n")) prf->email=strdup(s);
		} else if(strcmp(s,"dlpath")==0) {
			if(s=strtok(NULL,"\n")) prf->dlpath=strdup(s);
		} else if(strcmp(s,"linktype")==0) {
			if(s=strtok(NULL,"\n")) prf->link=atoi(s);
		} else if(strcmp(s,"optclrlist")==0) {
			prf->clrlist = 1;
		} else if(strcmp(s,"autoconnect")==0) {
			prf->autocon = 1;
		} else if(strcmp(s,"fullpath")==0) {
			prf->fullpath = 1;
		}
	}
	fclose(f);
}


void prf_save(char *fname)
{
	FILE *f;
	u_long tmp;
	int i;

	f=fopen(fname,"w");
	if(f==0) {
		gui_debug((char *)MSG_ERROR_SAVE);
		return;
	}

	GetAttr(MUIA_Menuitem_Checked,gui->iconpanelmenu,&tmp);
	if(tmp==FALSE) fprintf(f,"noiconpanel \n");

	if(prf->mainserver) fprintf(f,"mainserver %s\n",prf->mainserver);
	if(prf->server) fprintf(f,"server %s\n",prf->server);
	if(prf->napvers) fprintf(f,"napvers %s\n",prf->napvers);
	fprintf(f,"listport %d\n",prf->port);
	if(prf->user) fprintf(f,"user %s\n",prf->user);
	if(prf->pass) fprintf(f,"pass %s\n",prf->pass);
	if(prf->email) fprintf(f,"email %s\n",prf->email);
	if(prf->dlpath) fprintf(f,"dlpath %s\n",prf->dlpath);
	fprintf(f,"linktype %d\n",prf->link);
	if(prf->clrlist) fprintf(f,"optclrlist \n");
	if(prf->autocon) fprintf(f,"autoconnect \n");
	if(prf->fullpath) fprintf(f,"fullpath \n");

	for(i=0;i<7;i++) {
		if(prf->scripts[i]) fprintf(f,"script %d %s\n",i+1,prf->scripts[i]);
		if(prf->sounds[i]) fprintf(f,"sound %d %s\n",i+1,prf->sounds[i]);
	}

	fprintf(f,"<search> \n");
	DoMethod(gui->searchpanel,SEARCH_SAVEPRF,f);

	fclose(f);
}


void prf_entry(struct prfdata *data)
{
	u_long tmp,tmp2;

	GetAttr(MUIA_NList_EntryClick,data->evtlist,&tmp);
	set(data->evtscript,MUIA_Disabled,FALSE);
	set(data->evtsound,MUIA_Disabled,FALSE);
	if(tmp==-1 || tmp==-2) return;

	if(data->lastitem != -1) {
		int i = data->lastitem;
		if(prf_eventflags[i]&1) {
			GetAttr(MUIA_String_Contents,data->evtscript,&tmp2);
			if(((char*)tmp2)[0]==0) prf->scripts[i]=NULL; else prf->scripts[i]=strdup((char*)tmp2);
		}
		if(prf_eventflags[i]&2) {
			GetAttr(MUIA_String_Contents,data->evtsound,&tmp2);
			if(((char*)tmp2)[0]==0) prf->sounds[i]=NULL; else prf->sounds[i]=strdup((char*)tmp2);
		}
	}
	data->lastitem = tmp;

	set(data->evtscript,MUIA_String_Contents,prf->scripts[tmp]);
	set(data->evtsound,MUIA_String_Contents,prf->sounds[tmp]);

	if(!(prf_eventflags[tmp]&1))
		set(data->evtscript,MUIA_Disabled,TRUE);
	if(!(prf_eventflags[tmp]&2))
		set(data->evtsound,MUIA_Disabled,TRUE);
}


void prf_event(int no)
{
	if(prf_eventflags[no-1]&2 && prf->sounds[no-1])
		snd_play(prf->sounds[no-1]);
}
