#ifndef _NOEGNUD_GUI_H_
#define _NOEGNUD_GUI_H_

#define NOEGNUD_GUI_WIDGET 	0x01
#define NOEGNUD_GUI_WINDOW 	0x02
#define NOEGNUD_GUI_TEXT   	0x03
#define NOEGNUD_GUI_BUTTON 	0x04
#define NOEGNUD_GUI_VSCROLL	0x05
#define NOEGNUD_GUI_MENUITEM	0x06
#define NOEGNUD_GUI_GLYPH	0x07
#define NOEGNUD_GUI_PROGRESSBAR	0x08
#define NOEGNUD_GUI_TITLEBAR	0x09

#define NOEGNUD_GUI_MAX		0x09

#define NOEGNUD_GUI_BORDER_SIZE 8

#include "noegnud_glfuncs.h"
#include "noegnud_fonts.h"
#include "noegnud_collection.h"

#include "../../include/hack.h"

void noegnud_gui_init();
void noegnud_gui_done();

int noegnud_gui_get_fontwidth(void);
int noegnud_gui_get_fontheight(void);

typedef struct _noegnud_gui_twidget noegnud_gui_twidget;

typedef void noegnud_gui_kill_widget_proc(noegnud_gui_twidget *widget);
typedef void noegnud_gui_draw_widget_proc(noegnud_gui_twidget *widget, int drawchildren);
typedef void noegnud_gui_autosize_widget_proc(noegnud_gui_twidget *widget);
typedef void noegnud_gui_event_widget_proc(noegnud_gui_twidget *widget, SDL_Event *event);

void noegnud_gui_widget_addchild(noegnud_gui_twidget *widget,noegnud_gui_twidget *child);

int noegnud_gui_widget_contained(noegnud_gui_twidget* widget, int x, int y);

void noegnud_gui_draw_null(noegnud_gui_twidget *widget, int drawchildren);

struct _noegnud_gui_twidget {
    int type;

    noegnud_gui_twidget *parent;
    noegnud_gui_twidget *prevsibling;
    noegnud_gui_twidget *nextsibling;
    noegnud_gui_twidget *child;

    noegnud_gui_twidget *clipto;

    int x,y;
    int offset_x,offset_y;
    int width,height;

    GLfloat r, g, b,a;

    int mouseover_check;
    int mouseover;

    noegnud_tcollection *theme;

    noegnud_gui_twidget *vscrollwidget;
    noegnud_gui_twidget *hscrollwidget;

    int vscroll, hscroll;
    int vscroll_pos, hscroll_pos;
    int autocentre;

    noegnud_gui_draw_widget_proc *draw;
    noegnud_gui_autosize_widget_proc *autosize;
    noegnud_gui_kill_widget_proc *kill;
    noegnud_gui_event_widget_proc *event;

};

#define noegnud_gui_tvslider noegnud_gui_twindow

noegnud_gui_twidget *noegnud_gui_create_widget(noegnud_gui_twidget * parent, int x, int y, int width, int height, int datasize);

void noegnud_gui_kill_widget(noegnud_gui_twidget *widget);
void noegnud_gui_draw_widget(noegnud_gui_twidget *widget, int drawchildren);
void noegnud_gui_autosize_widget(noegnud_gui_twidget *widget);
void noegnud_gui_event_null(noegnud_gui_twidget *widget, SDL_Event *event);
void noegnud_gui_event_widget(noegnud_gui_twidget *widget, SDL_Event *event);

void noegnud_gui_widget_addchikillld(noegnud_gui_twidget *widget,noegnud_gui_twidget *child);
void noegnud_gui_widget_addsibling(noegnud_gui_twidget *widget,noegnud_gui_twidget *sibling);

void noegnud_gui_kill_widget_relatives(noegnud_gui_twidget *widget);

void noegnud_gui_offset_widget(noegnud_gui_twidget *widget, int offset_x, int offset_y);

// -------------------------------------------------------- WINDOW

typedef struct { // inherits from widget
    noegnud_gui_twidget widget;
    noegnud_glfuncs_timage *image;
    noegnud_gui_twidget *tomove;
    noegnud_gui_twidget *titlebar;
    int localimage;
    int autoresize;
    int rip;
    int rip_how;
    int image_tiled;
    int movable;
    int movement_lock_x;
    int refreshtitlebar;
} noegnud_gui_twindow;

noegnud_gui_twindow *noegnud_gui_create_window(
					       noegnud_gui_twidget * parent,
					       int x, int y,
					       int width, int height,
					       GLfloat r, GLfloat g, GLfloat b, GLfloat a,
					       int datasize);
void noegnud_gui_draw_window(noegnud_gui_twindow *window, int drawchildren);
void noegnud_gui_event_window(noegnud_gui_twindow *window, SDL_Event *event);
void noegnud_gui_kill_window(noegnud_gui_twindow *window);

// -------------------------------------------------------- TEXT

typedef struct {
    noegnud_gui_twidget widget;
    GLfloat r,g,b;
    char *text;
    noegnud_fonts_tfont *font;
    int dynamiccharwidth;
} noegnud_gui_ttext;

noegnud_gui_ttext *noegnud_gui_create_text(
					   noegnud_gui_twidget * parent,
					   int x, int y,
					   int width, int height,
					   GLfloat r, GLfloat g, GLfloat b,
					   const char *text);
void noegnud_gui_draw_text(noegnud_gui_ttext *text, int drawchildren);
void noegnud_gui_kill_text(noegnud_gui_ttext *text);

// -------------------------------------------------------- BUTTON

typedef struct { // inherits from window
    noegnud_gui_twindow window;
    noegnud_gui_ttext *text;
    int accelerator;
} noegnud_gui_tbutton;

noegnud_gui_tbutton *noegnud_gui_create_button(
					       noegnud_gui_twidget * parent,
					       int x, int y,
					       int width, int height,
					       GLfloat r, GLfloat g, GLfloat b, GLfloat a,
					       GLfloat tr, GLfloat tg, GLfloat tb,
					       char *string,
					       int accelerator);
void noegnud_gui_draw_button(noegnud_gui_tbutton *button, int drawchildren);
void noegnud_gui_event_button(noegnud_gui_tbutton *button, SDL_Event *event);

// -------------------------------------------------------- TEXTBUTTON

noegnud_gui_tbutton *noegnud_gui_create_textbutton(
						   noegnud_gui_twidget * parent,
						   int x, int y,
						   GLfloat r, GLfloat g, GLfloat b, GLfloat a,
						   GLfloat tr, GLfloat tg, GLfloat tb,
						   char *string,
						   char accelerator);

// -------------------------------------------------------- PROGRESSBAR

typedef struct { // inherits from window
    noegnud_gui_twindow window;
    int minimum,maximum,value;
    GLfloat br, bg, bb, ba;
} noegnud_gui_tprogressbar;

noegnud_gui_tprogressbar *noegnud_gui_create_progressbar(
							 noegnud_gui_twidget * parent,
							 int x, int y,
							 int width, int height,
							 GLfloat r, GLfloat g, GLfloat b, GLfloat a,
							 int minimum, int maximum,
							 GLfloat br, GLfloat bg, GLfloat bb, GLfloat ba);
void noegnud_gui_draw_progressbar(noegnud_gui_tprogressbar *progress, int drawchildren);

// -------------------------------------------------------- GLYPH

typedef struct {
    noegnud_gui_twidget widget;
    int glyph;
    noegnud_gui_twidget *activepopup;
} noegnud_gui_tglyph;

noegnud_gui_tglyph *noegnud_gui_create_glyph(
					     noegnud_gui_twidget * parent,
					     int x, int y,
					     int width, int height,
					     int glyph);
void noegnud_gui_draw_glyph(noegnud_gui_tglyph *glyph, int drawchildren);
void noegnud_gui_event_glyph(noegnud_gui_tglyph *glyph, SDL_Event *event);


// -------------------------------------------------------- VSLIDER

typedef struct {
    noegnud_gui_twidget widget;
} noegnud_gui_tvscroll;

noegnud_gui_tvscroll *noegnud_gui_create_vscroll(noegnud_gui_twidget * parent);
void noegnud_gui_event_vscroll(noegnud_gui_tvscroll *vscroll, SDL_Event *event);
void noegnud_gui_autosize_vscroll(noegnud_gui_tvscroll *vscroll);

void noegnud_gui_draw_vslider(noegnud_gui_tvslider *vslider, int drawchildren);

// -------------------------------------------------------- MENUITEM

typedef struct {
    //noegnud_gui_twidget widget;
    noegnud_gui_twindow window;
;
    GLfloat r, g, b,a;
    anything identifier;
    char ch;
    char gch;
    int selected;
    int highlighted;
    char *text;
} noegnud_gui_tmenuitem;

noegnud_gui_tmenuitem *noegnud_gui_create_menuitem(
						   noegnud_gui_twidget * parent,
						   int x, int y,
						   int width, int height,
						   GLfloat r, GLfloat g, GLfloat b, GLfloat a,
						   anything identifier,
						   char ch,
						   char gch,
						   int selected);
void noegnud_gui_draw_menuitem(noegnud_gui_tmenuitem *menuitem, int drawchildren);
void noegnud_gui_event_menuitem(noegnud_gui_tmenuitem *menuitem, SDL_Event *event);

// --------------------------------------------------------

void noegnud_gui_nh_putstr(noegnud_gui_twindow *window, const char *text, GLfloat r, GLfloat g, GLfloat b);
void noegnud_gui_add_actionbutton(noegnud_gui_twindow *window, const char *text, char accelerator);

void noegnud_gui_nh_addmenu(noegnud_gui_twindow *window, anything identifier, int glyph, char ch, char gch, const char *text, int selected);
void noegnud_gui_nh_addmenu_menuitem_addaccelerator(noegnud_gui_twidget *menuitem, char ch);

noegnud_gui_twidget *noegnud_gui_nh_yn_function(const char *question, const char *choices, char def);
noegnud_gui_twidget *noegnud_gui_nh_getlin(const char *ques, const char *input);

noegnud_gui_tprogressbar *noegnud_gui_inconsole_progressbar(const char *text, int minimum, int maximum, GLfloat r, GLfloat g, GLfloat b, GLfloat a);
void noegnud_gui_inconsole_noegnudtext(noegnud_gui_twidget *widget, const char *text, int dynamic, GLfloat r, GLfloat g, GLfloat b);

void noegnud_gui_reshuffle_console_children(noegnud_gui_twidget *widget);

void noegnud_gui_draw_minimap(noegnud_gui_twindow *window, int drawchildren);
void noegnud_gui_event_minimap(noegnud_gui_twidget *map, SDL_Event *event);

int noegnud_gui_widget_getabsolute_x(noegnud_gui_twidget *widget);
int noegnud_gui_widget_getabsolute_y(noegnud_gui_twidget *widget);


#endif // _NOEGNUD_GUI_H_

