#include <agar/core.h>
#include <agar/gui.h>
#include <unistd.h>
#include <math.h>
#include <string.h>

#include "SDL.h"
#include "SDL_image.h"

AG_Tlist *tl;
AG_Table *details;
AG_Button *play;
AG_Window *imagewin;

char *file;
char *filename;
int listclear=0, rotation=0;
double x,y;
static double zoom=1.0;
Uint32 winflags = AG_WINDOW_NOMINIMIZE|AG_WINDOW_NOMAXIMIZE|AG_WINDOW_NORESIZE;
SDL_Surface *image;


static void UpdateTable(int clear){
	if(clear) {
	AG_TableInit(details, AG_TABLE_EXPAND);
	AG_TableAddCol(details, "Parameter", "<11111111>", NULL);
	AG_TableAddCol(details, "Value", "<11111111111111111111>", NULL);
	AG_TableAddRow(details, "%s:%s","Filename","");
	AG_TableAddRow(details, "%s:%s","Path","");
	AG_TableAddRow(details, "%s:%s","Width","");
	AG_TableAddRow(details, "%s:%s","Height","");
	AG_TableAddRow(details, "%s:%s","Depth","");
	}
	else {
	AG_TableInit(details, AG_TABLE_EXPAND);
	AG_TableAddCol(details, "Parameter", "<11111111>", NULL);
	AG_TableAddCol(details, "Value", "<11111111111111111111>", NULL);
	AG_TableAddRow(details, "%s:%s","Filename",filename);
	AG_TableAddRow(details, "%s:%s","Path",file);
	AG_TableAddRow(details, "%s:%d","Width",image->w);
	AG_TableAddRow(details, "%s:%d","Height",image->h);
	AG_TableAddRow(details, "%s:%d","Depth",image->format->BitsPerPixel);
	}
}

void
imageclose(AG_Event *event)
{
	UpdateTable(1);
	image == NULL;
	file = NULL;
	AG_WindowHide(imagewin);
}

static void
LoadFile(AG_Event *event)
{
	AG_Pixmap *px;
	Uint32 flags;
	AG_TlistItem *item;

	item = AG_TlistSelectedItem(tl);
	file = item->text;
	filename = strrchr(file,'/')+1;
//	sprintf(file,"/home/abhishek/%s",item->text);

	imagewin = AG_WindowNew(winflags);
	AG_WindowSetCaption(imagewin,filename);

	image = IMG_Load(file);

	if ( image != NULL ) {
	px = AG_PixmapFromSurface(imagewin,AG_PIXMAP_EXPAND,image);

/*	screen = SDL_SetVideoMode(image->w, image->h, 32, flags);
	if ( screen == NULL ) {
		fprintf(stderr,"Couldn't set %dx%dx%d video mode: %s\n",image->w, image->h, 8, SDL_GetError());
	}

	/* Display the image */
	
	UpdateTable(0);

	AG_WindowSetPosition(imagewin,AG_WINDOW_UPPER_LEFT,0);
	AG_SetEvent(imagewin,"window-close",imageclose,NULL);
	AG_WindowShow(imagewin);

	} else {
	AG_TextMsg(AG_MSG_INFO, "Couldn't load %s: %s", file, SDL_GetError());
	}
}

static void
SelectFile(AG_Event *event){
		char *currfile = AG_STRING(1);
		if(listclear==0){
		AG_TlistClear(tl);
		}
//		filename = strrchr(currfile,'/')+1;
		AG_TlistAdd(tl, NULL, currfile);
		listclear++;
//		AG_SetEvent(play,"button-pushed",LoadFile,"%s", file);
		AG_SetEvent(play,"button-pushed",LoadFile,NULL);
		AG_ButtonEnable(play);
}

static void
OpenFile()
{
	AG_FileDlg *fd;
	AG_Window *win;
	AG_TlistDeselectAll(tl);
	win = AG_WindowNew(winflags);
	AG_WindowSetCaption(win,"Choose file(s)");
	fd = AG_FileDlgNew(win,AG_FILEDLG_MULTI | AG_FILEDLG_LOAD | AG_FILEDLG_CLOSEWIN);
	AG_WindowSetPosition(win,AG_WINDOW_LOWER_RIGHT,1);
	//AG_SetEvent(fd,"dir-selected",LoadFile,"he");
	AG_FileDlgSetDirectory(fd, "/home/abhishek");
	AG_FileDlgSetFilename(fd, "");
	AG_FileDlgAddType(fd, "Image file", "*.jpg", SelectFile, NULL);
	AG_FileDlgAddType(fd, "PNM/PPM File", "*.pnm,*.ppm", SelectFile, NULL);
	AG_WindowShow(win);
}

void DeleteFile()
{
	if(AG_TlistSelectedItem(tl) != NULL && listclear !=0){
	AG_TlistDel(tl,AG_TlistSelectedItem(tl));
	listclear--;
	}
}

void ClearList()
{
	AG_TlistClear(tl);
	listclear=0;
	AG_TlistAdd(tl, NULL, "No File(s) selected.");
	AG_ButtonDisable(play);
}
void
windowclose(AG_Event *event)
{
	AG_Quit();
}

static void
CreateWindow(void)
{
	AG_Window *win;
	AG_HBox *hbox;
	AG_VBox *vbox;
	AG_Pane *pane;
	AG_Button *stop, *add , *remove, *clear;
	AG_Event *ev2;
	AG_Toolbar *control;
	AG_Box *div1, *div2;
	int i;

	win = AG_WindowNew(winflags);
	AG_WindowSetCaption(win,"SDL Media Viewer");
	AG_WindowSetPosition(win,AG_WINDOW_LOWER_RIGHT,0);
	AG_SetEvent(win,"window-close",windowclose,NULL);
	
	pane = AG_PaneNew(win, AG_PANE_VERT, AG_PANE_EXPAND);
	div1 = pane->div[0];
	div2 = pane->div[1];
	AG_BoxSetSpacing(div1,4);
	AG_BoxSetPadding(div2,5);

//	AG_LabelNewStatic(div1,"Image Details");
//	AG_SetEvent(btn,"button-pushed",ok_pressed,"%s");

	hbox = AG_HBoxNew(div1,AG_HBOX_HFILL|AG_HBOX_HOMOGENOUS);

//	AG_ToolbarInit(control, AG_TOOLBAR_HORIZ, 1, AG_TOOLBAR_HOMOGENOUS);
//	next = AG_ButtonNew(hbox, 0, "Prev <<");
//	back = AG_ButtonNew(hbox, 0, "Next >>");
	play = AG_ButtonNew(hbox, 0, "DISPLAY IMAGE");
	AG_ButtonDisable(play);
//	stop = AG_ButtonNew(hbox, AG_BUTTON_STICKY, "PLAY");
//	AG_SetEvent(play,"button-pushed",LoadFile,"%s", file);
//	AG_ButtonSetPadding(next,10);
//	AG_ButtonSetPadding(back,10);
	AG_ButtonSetPadding(play,5);
//	AG_ButtonSetPadding(stop,10);

	AG_Notebook *nb;
	AG_NotebookTab *ntab;
	AG_HBox *hb;
	AG_FileDlg *fd;

		nb = AG_NotebookNew(div2, AG_NOTEBOOK_EXPAND);
		ntab = AG_NotebookAddTab(nb, "Images", AG_BOX_VERT);
		tl = AG_TlistNew(ntab, AG_TLIST_EXPAND);
//		AG_SetEvent(tl,"tlist-selected",Selectimage,"%s", file);
		AG_TlistSetItemHeight(tl,25);
		if(listclear==0){
		AG_TlistAdd(tl, NULL, "No File(s) selected.");
		}
		AG_SeparatorNew(ntab, AG_SEPARATOR_HORIZ);
		hb = AG_HBoxNew(ntab, AG_HBOX_HFILL | AG_HBOX_HOMOGENOUS);
		add = AG_ButtonNew(hb, 0, "Add File");
		remove = AG_ButtonNew(hb, 0, "Remove File");
		clear = AG_ButtonNew(hb, 0, "Clear");
		AG_SetEvent(add, "button-pushed", OpenFile ,NULL);
		AG_SetEvent(remove, "button-pushed", DeleteFile ,NULL);
		AG_SetEvent(clear, "button-pushed", ClearList ,NULL);
	
		/*ntab = AG_NotebookAddTab(nb, "Open", AG_BOX_VERT);
		fd = AG_FileDlgNew(ntab,AG_FILEDLG_MULTI|AG_FILEDLG_LOAD);
			//AG_SetEvent(fd,"dir-selected",LoadFile,"he");
			AG_FileDlgSetDirectory(fd, "/");
			AG_FileDlgSetFilename(fd, "");
			AG_FileDlgAddType(fd, "Image file", "*.jpg", LoadFile, NULL);
			AG_FileDlgAddType(fd, "PNM/PPM File", "*.pnm,*.ppm", LoadFile, NULL);
		*/
		
		ntab = AG_NotebookAddTab(nb, "Display", AG_BOX_VERT);
		vbox = AG_VBoxNew(ntab,AG_VBOX_HOMOGENOUS|AG_VBOX_VFILL|AG_VBOX_HFILL);

		AG_VBoxSetPadding(vbox,20);
		AG_VBoxSetSpacing(vbox,3);

//			table = AG_TableNew(ntab, AG_TABLE_EXPAND);
//			AG_TableAddCol(table, "x", "<8888>", NULL);
//			AG_TableAddCol(table, "sin(x)", "<8888>", NULL);
//			AG_TableAddCol(table, "cos(x)", NULL, NULL);

			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_LabelNewStatic(vbox,"TILED WALL DISPLAY OPTIONS");
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_CheckboxNew(vbox, 0, "Scale To Fit");
			AG_CheckboxNew(vbox, 0, "Maintain Aspect Ratio");
			AG_CheckboxNew(vbox, 0, "Show original resolution");
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);			
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_LabelNewStatic(vbox,"SERVER NODE DISPLAY OPTIONS");
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_CheckboxNew(vbox, 0, "FullScreen");
			AG_CheckboxNew(vbox, 0, "Show original resolution");
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
		
		ntab = AG_NotebookAddTab(nb, "Options", AG_BOX_VERT);
		//vbox = AG_VBoxNew(ntab,AG_HBOX_HOMOGENOUS|AG_HBOX_VFILL|AG_HBOX_HFILL);
		vbox = AG_VBoxNew(ntab,AG_VBOX_VFILL|AG_VBOX_HFILL);
		AG_FSpinbutton *zsb;
		AG_MFSpinbutton *psb;
		AG_Spinbutton *rsb;
		AG_VBoxSetPadding(vbox,20);
		AG_VBoxSetSpacing(vbox,4);
			
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_LabelNewStatic(vbox,"ZOOMING");
//			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			zsb = AG_FSpinbuttonNew(vbox, 0, NULL, "Zooming Factor:");
			AG_WidgetBindDouble(zsb, "value", &zoom);
			AG_FSpinbuttonSetValue(zsb,1.0);
			AG_FSpinbuttonSetIncrement(zsb,0.1);
			AG_FSpinbuttonSetRange(zsb,0.0,3.0);


			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_LabelNewStatic(vbox,"PANNING");
//			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			psb = AG_MFSpinbuttonNew(vbox, 0, NULL , " , ", "Position: ");
			AG_WidgetBindDouble(psb, "xvalue", &x);
			AG_WidgetBindDouble(psb, "yvalue", &y);
			AG_MFSpinbuttonSetIncrement(psb, 10);


			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			AG_LabelNewStatic(vbox,"ROTATION");
//			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);
			rsb = AG_SpinbuttonNew(vbox, 0, "Angle: (degrees)");
			AG_WidgetBindInt(rsb, "value", &rotation);
			AG_SpinbuttonSetValue(rsb,0);
			AG_SpinbuttonSetIncrement(rsb,45);
			AG_SpinbuttonSetRange(rsb,-180,180);
			AG_SeparatorNew(vbox, AG_SEPARATOR_HORIZ);

			
		ntab = AG_NotebookAddTab(nb, "Details", AG_BOX_VERT);
		{
			details = AG_TableNew(ntab, AG_TABLE_EXPAND);
			UpdateTable(1);
		}

	AG_WindowShow(win);
}


int main(int argc, char *argv[])
{
	int fps=-1;
	
	if (AG_InitCore("sdl", 0) == -1) {
		fprintf(stderr, "%s\n", AG_GetError());
		return (1);
	}

//	AG_SetBool(agConfig, "view.full-screen", 1);

//	mpane = AG_MPaneNew(win,AG_MPANE2H,AG_MPANE_FRAMES);
//	AG_MPaneInit(mpane,AG_MPANE2H,AG_MPANE_FRAMES);
	if (AG_InitVideo(1024, 768, 32, 0) == -1 ||
	    AG_InitInput(0) == -1) {
		fprintf(stderr, "%s\n", AG_GetError());
		return (-1);
	}	

	AG_InitConfigWin(0);
	AG_SetRefreshRate(fps);
	AG_BindGlobalKey(SDLK_ESCAPE, KMOD_NONE, AG_Quit);
	AG_BindGlobalKey(SDLK_F1, KMOD_NONE, AG_ShowSettings);
	AG_BindGlobalKey(SDLK_F8, KMOD_NONE, AG_ViewCapture);
	
	CreateWindow();

	AG_EventLoop();
	AG_Destroy();
	return (0);
}
