/*
** Preferences
*/

#include "config.h"

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

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

#include "gui.h"
#include "prefs.h"
#include "info.h"

ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg);
void _prf_set(struct prfdata *data);
void _prf_use(struct prfdata *data);

/* defaults for preferences */
char *pref_mainserver="server.napster.com:8875";
char *pref_server=NULL;
char *pref_napvers="V2.0 BETA 3";
char *pref_user="luser42";
char *pref_pass="pussy";
char *pref_dlpath="ram:";
int pref_link=3;
int pref_regflag=1;
int pref_clrlist=0;


MUIF prf_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
	switch(msg->MethodID) {
		case OM_NEW: return(prf_new(cl,obj,(APTR)msg));
		case PRF_OPEN:
			{
			struct prfdata *data = INST_DATA(cl,obj);
			_prf_set(data);
			set(obj,MUIA_Window_Open,TRUE);
			return(NULL);
			}
		case PRF_USE:
			{
			struct prfdata *data = INST_DATA(cl,obj);
			_prf_use(data);
			set(obj,MUIA_Window_Open,FALSE);
			return(NULL);
			}
		case PRF_SAVE:
			{
			struct prfdata *data = INST_DATA(cl,obj);
			_prf_use(data);
			set(obj,MUIA_Window_Open,FALSE);
			prf_save();
			return(NULL);
			}
		case PRF_CANCEL:
			set(obj,MUIA_Window_Open,FALSE);
			return(NULL);
	}
	return(DoSuperMethodA(cl,obj,msg));
}


ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg)
{
	struct prfdata *data;
	Object *idstr,*pwstr,*pathstr,*links,*clrtog,*msstr,*sstr,*vstr,*savbut,*usebut,*canbut;
	static char *PrefsPages[] = { "User", "Options", "Advanced", NULL };

	if (obj = (Object *)DoSuperNew(cl,obj,
		WindowContents, VGroup,
			Child, RegisterGroup(PrefsPages),
			Child, ColGroup(2),
				Child, Label2("Username"),
				Child, idstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
				End,
				Child, Label2("Password"),
				Child, pwstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
				End,
				Child, Label2("Connection"),
				Child, links = CycleObject,
					MUIA_Cycle_Active, pref_link,
					MUIA_Cycle_Entries, nap_linktype,
				End,
				Child, Label2("DL path"),
				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, "Select your download directory...",
					ASLFR_DrawersOnly, TRUE,
				End,
			End,
			Child, ColGroup(2),
				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, "Clear list before new searches.",
				End,
			End,
			Child, ColGroup(2),
				Child, Label2("Main Server"),
				Child, msstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
					MUIA_ShortHelp, "Amster gets mp3 server address from this"
							" server. You don't need to change it.",
				End,
				Child, Label2("MP3 Server"),
				Child, sstr = StringObject,
					StringFrame,
					MUIA_String_AdvanceOnCR, TRUE,
					MUIA_CycleChain, 1,
					MUIA_ShortHelp, "mp3 server address. If you want to get it"
							" from main server, leave this string empty.",
				End,
				Child, Label2("Version"),
				Child, vstr = StringObject,
					StringFrame,
					MUIA_CycleChain, 1,
				End,
			End,
			End,
			Child, HGroup,
				Child, savbut = SimpleButton("_Save"),
				Child, usebut = SimpleButton("_Use"),
				Child, canbut = SimpleButton("_Cancel"),
			End,

		End,
		TAG_MORE, msg->ops_AttrList))
	{
		data = INST_DATA(cl,obj);
		data->idstr = idstr;
		data->pwstr = pwstr;
		data->pathstr = pathstr;
		data->links = links;
		data->clrtog = clrtog;
		data->msstr = msstr;
		data->sstr = sstr;
		data->vstr = vstr;

		set(obj,MUIA_Window_ID,MAKE_ID('S','E','T','T'));
		set(obj,MUIA_Window_Title,"Amster settings..."),

		DoMethod(canbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,PRF_CANCEL);
		DoMethod(obj,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,obj,1,PRF_CANCEL);
		DoMethod(usebut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,PRF_USE);
		DoMethod(savbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,PRF_SAVE);

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


void _prf_set(struct prfdata *data)
{
	set(data->msstr,MUIA_String_Contents,pref_mainserver);
	set(data->sstr,MUIA_String_Contents,pref_server);
	set(data->vstr,MUIA_String_Contents,pref_napvers);
	set(data->idstr,MUIA_String_Contents,pref_user);
	set(data->pwstr,MUIA_String_Contents,pref_pass);
	set(data->pathstr,MUIA_String_Contents,pref_dlpath);
	set(data->links,MUIA_Cycle_Active,pref_link);
	set(data->clrtog,MUIA_Selected,pref_clrlist);
}


void _prf_use(struct prfdata *data)
{
	u_long tmp;

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

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

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

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

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

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

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

	GetAttr(MUIA_Selected,data->clrtog,&tmp);
	pref_clrlist = tmp;
}


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

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

	while(fgets(tmp,sizeof(tmp),f)) {
		s = strtok(tmp," ");
		if(!s) {
			continue;
		} else if(strcmp(s,"mainserver")==0) {
			if(s=strtok(NULL,"\n")) pref_mainserver=strdup(s);
		} else if(strcmp(s,"server")==0) {
			if(s=strtok(NULL,"\n")) pref_server=strdup(s);
		} else if(strcmp(s,"napvers")==0) {
			if(s=strtok(NULL,"\n")) pref_napvers=strdup(s);
		} else if(strcmp(s,"user")==0) {
			if(s=strtok(NULL,"\n")) pref_user=strdup(s);
		} else if(strcmp(s,"pass")==0) {
			if(s=strtok(NULL,"\n")) pref_pass=strdup(s);
		} else if(strcmp(s,"dlpath")==0) {
			if(s=strtok(NULL,"\n")) pref_dlpath=strdup(s);
		} else if(strcmp(s,"linktype")==0) {
			if(s=strtok(NULL,"\n")) pref_link=atoi(s);
		} else if(strcmp(s,"optclrlist")==0) {
			pref_clrlist = 1;
		}
	}
	fclose(f);
}


void prf_save(void)
{
	FILE *f;

	f=fopen(AMSTER_PREFS,"w");
	if(f==0) {
		gui_debug("Cannot save configuration!");
		return;
	}
	if(pref_mainserver) fprintf(f,"mainserver %s\n",pref_mainserver);
	if(pref_server) fprintf(f,"server %s\n",pref_server);
	if(pref_napvers) fprintf(f,"napvers %s\n",pref_napvers);
	if(pref_user) fprintf(f,"user %s\n",pref_user);
	if(pref_pass) fprintf(f,"pass %s\n",pref_pass);
	if(pref_dlpath) fprintf(f,"dlpath %s\n",pref_dlpath);
	fprintf(f,"linktype %d\n",pref_link);
	if(pref_clrlist) fprintf(f,"optclrlist \n");
	fclose(f);
}
