#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
//#include <sys/time.h>
#include <gtk/gtk.h>
#include <cairo/cairo.h>

//struct timeval starttime,endtime;
//uint32_t fps_c = 0;

struct GTK_Main_Window{
	GtkWidget *main_window;
	GtkWidget *vert_box;
	GtkWidget *button_container;
	GtkWidget *button1;
	GtkWidget *button2;
	GtkWidget *button3;
	//GtkWidget *button4;
	GtkDrawingArea *cairo_area;
};

struct GTK_Settings_Widgets{
	GtkWidget *button_container;
	GtkWidget *button1;


	GtkWidget *start_game_button;
};

struct All_Colors{
    unsigned char background_r;
    unsigned char background_g;
    unsigned char background_b;
    unsigned char hlines_r;
    unsigned char hlines_g;
    unsigned char hlines_b;
    unsigned char clines_r;
    unsigned char clines_g;
    unsigned char clines_b;
};

void Setup_Def_Colors(struct All_Colors *chart_colors){

    chart_colors->background_r = 255;
    chart_colors->background_g = 255;
    chart_colors->background_b = 255;
    chart_colors->hlines_r = 0;
    chart_colors->hlines_g = 0;
    chart_colors->hlines_b = 0;
    chart_colors->clines_r = 0;
    chart_colors->clines_g = 0;
    chart_colors->clines_b = 255;
}


static gboolean on_expose_cairo(GtkWidget *widget, GdkEventExpose *event, gpointer chart_colors);

void on_destroy(GtkWidget *widget, gpointer mw){
	/*
	//gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).cairo_area));
	gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).button1));
	gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).button2));
	gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).button3));
	gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).button4));
	gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).button_container));
	gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).vert_box));
	//gtk_widget_destroy(GTK_WIDGET((*(struct GTK_Main_Window *)mw).main_window));
	*/
	gtk_main_quit();
}

int main(int argc, char **argv){
	gtk_init (&argc, &argv);
	struct GTK_Main_Window mw;
	struct All_Colors all_colors;
	Setup_Def_Colors(&all_colors);
	//gettimeofday(&starttime, NULL);
	mw.main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	mw.vert_box = gtk_vpaned_new();
	mw.button_container = gtk_table_new(1, 4, TRUE);
	mw.button1 = gtk_button_new_with_label("Roll Dice");
	mw.button2 = gtk_button_new_with_label("End Turn");

	//mw.button3 = gtk_button_new_with_label("Settings");

	mw.button3 = gtk_button_new_with_label("Exit");
	mw.cairo_area = GTK_DRAWING_AREA(gtk_drawing_area_new());
	//main window attributes
	gtk_container_set_border_width(GTK_CONTAINER(mw.main_window), 2);
	gtk_window_set_default_size(GTK_WINDOW(mw.main_window), 800, 600);
	gtk_window_set_title(GTK_WINDOW(mw.main_window), "linuxsociety 10K v0.0.1");
	//button container
	gtk_table_attach(GTK_TABLE(mw.button_container), mw.button1, 0, 1, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	gtk_table_attach(GTK_TABLE(mw.button_container), mw.button2, 1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	gtk_table_attach(GTK_TABLE(mw.button_container), mw.button3, 2, 3, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	//gtk_table_attach(GTK_TABLE(mw.button_container), mw.button4, 3, 4, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	//paned setup
	gtk_paned_set_position(GTK_PANED(mw.vert_box), 560);
	gtk_paned_pack1(GTK_PANED(mw.vert_box), GTK_WIDGET(mw.cairo_area), TRUE, TRUE);
	gtk_paned_pack2(GTK_PANED(mw.vert_box), GTK_WIDGET(mw.button_container), TRUE, TRUE);
	//add vert box to the window
	gtk_container_add(GTK_CONTAINER(mw.main_window), mw.vert_box);

	g_signal_connect(mw.main_window, "destroy", G_CALLBACK(on_destroy), &mw);
	g_signal_connect(G_OBJECT(mw.button3), "button-release-event", G_CALLBACK(on_destroy), &mw);
	g_signal_connect(G_OBJECT(mw.cairo_area), "expose-event", G_CALLBACK(on_expose_cairo), &all_colors);

	gtk_widget_show_all(mw.main_window);
	gtk_main();
	return 0;
}

static gboolean on_expose_cairo(GtkWidget *widget, GdkEventExpose *event, gpointer chart_colors){
	cairo_format_t format;
	cairo_surface_t *target;
	cairo_t *context;
	cairo_status_t status;
	//static double time1 = 2;
	//static double fps = 0;
	double red, green, blue, alpha;
	double x1, y1, x2, y2;
	int width = widget->allocation.width;
	int height = widget->allocation.height;
	int stride;
	unsigned char *img_data;
	format = CAIRO_FORMAT_ARGB32;
	stride = cairo_format_stride_for_width (format, width);
	img_data = malloc(stride * height);
	target = cairo_image_surface_create_for_data(img_data, format, width, height, stride);
	context = gdk_cairo_create(widget->window);
	status = cairo_status(context);
	if(status != 0){
		printf("Error: %s\n", cairo_status_to_string(status) );
		free(img_data);
		cairo_destroy(context);
		cairo_surface_destroy(target);
		//exit(1);
		return 1;
	}
	/*
	fps_c++;
	if(time1 > 1){
		gettimeofday(&endtime, NULL);
		time1=((double)(endtime.tv_sec*1000000-starttime.tv_sec*1000000+endtime.tv_usec-starttime.tv_usec))/1000000;
		fps = fps_c / time1;
		gettimeofday(&starttime, NULL);
		fps_c = 0;
	}else{
		gettimeofday(&endtime, NULL);
		time1=((double)(endtime.tv_sec*1000000-starttime.tv_sec*1000000+endtime.tv_usec-starttime.tv_usec))/1000000;
	}
	printf("FPS: %lf\n", fps);
	*/
	//GTK_WIDGET((*(struct GTK_Main_Window *)mw).button1)
	red = (double)((*(struct All_Colors *)chart_colors).background_r)/255;
	green = (double)((*(struct All_Colors *)chart_colors).background_g)/255;
	blue = (double)((*(struct All_Colors *)chart_colors).background_b)/255;
	
	//red = (double)chart_colors.background_r/255;
	//green = (double)chart_colors.background_g/255;
	//blue = (double)chart_colors.background_b/255;
	alpha = 1.0;
	x1 = 0;
	y1 = 0;
    x2 = width;
    y2 = height;


    cairo_set_source_rgba(context, red, green, blue, alpha);
    cairo_rectangle(context, 0, 0, width, height);
    cairo_fill(context);

	red = (double)((*(struct All_Colors *)chart_colors).hlines_r)/255;
	green = (double)((*(struct All_Colors *)chart_colors).hlines_g)/255;
	blue = (double)((*(struct All_Colors *)chart_colors).hlines_b)/255;

    //red = (double)chart_colors.hlines_r/255;
    //green = (double)chart_colors.hlines_g/255;
    //blue = (double)chart_colors.hlines_b/255;
    alpha = 1.0;

    cairo_set_dash(context, 0, 0, 0);
    cairo_set_source_rgba(context, red, green, blue, alpha);
    cairo_set_line_width(context, 1);

    cairo_move_to(context, x1, y1);
    cairo_line_to(context, x2, y2);

    cairo_stroke(context);

    cairo_destroy(context);
    cairo_surface_destroy(target);
	free(img_data);

    return 0;
}
