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

uint32_t dice_num = 1;

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

struct GTK_Settings_Widgets{
	GtkWidget *button_container;
	GtkWidget *button1;
	GtkWidget *start_game_button;
};

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

void on_destroy(GtkWidget *widget, gpointer mw){
	gtk_main_quit();
}

int main(int argc, char **argv){
	gtk_init (&argc, &argv);
	struct GTK_Main_Window mw;
	mw.main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //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");



	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("Exit");
	//mw.cairo_area = GTK_DRAWING_AREA(gtk_drawing_area_new());
//	mw.cairo_area = gtk_drawing_area_new();
//   mw.drawing_area = GTK_DRAWING_AREA(gtk_drawing_area_new ());
  // mw.cairo_area = GTK_WIDGET(mw.drawing_area);

	mw.cairo_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.button1), "button-press-event", G_CALLBACK(on_roll), (gpointer)&mw);

	g_signal_connect(G_OBJECT(mw.button2), "button-release-event", G_CALLBACK(on_roll), (gpointer)&mw);
	//g_signal_connect(G_OBJECT(mw.cai), "button-release-event", G_CALLBACK(on_expose_cairo), NULL);
	g_signal_connect(G_OBJECT(mw.button3), "button-release-event", G_CALLBACK(on_destroy), (gpointer)&mw);
	//g_signal_connect(G_OBJECT(mw.cairo_area), "expose-event", G_CALLBACK(on_expose_cairo), &all_colors);
	g_signal_connect(G_OBJECT(mw.cairo_area), "expose-event", G_CALLBACK(on_expose_cairo), NULL);
	gtk_widget_show_all(mw.main_window);
	gtk_main();
	return 0;
}

static gboolean on_roll(GtkWidget *widget, GdkEventExpose *event, gpointer data){
	if(dice_num < 6)
		dice_num++;
	else
		dice_num = 1;
//	on_expose_cairo( GTK_WIDGET( ((struct GTK_Main_Window *)data)->cairo_area ), NULL);
	gboolean ret_val = FALSE;
	g_signal_emit_by_name(G_OBJECT( ((struct GTK_Main_Window *)data)->cairo_area ), "expose-event", G_CALLBACK(on_expose_cairo), &ret_val);
	if(ret_val == FALSE){
		printf("Error!\n");
		return FALSE;
	}
	gtk_widget_show_all( GTK_WIDGET( ((struct GTK_Main_Window *)data)->main_window) );
	//gtk_widget_show_all(widget);
	return TRUE;
}

//static uint8_t Create_Cairo_Dice(void){ GdkEventExpose *event
static gboolean on_expose_cairo(GtkWidget *widget, gpointer data){

//static gboolean on_expose_cairo(GtkWidget *widget, GdkEventExpose *event, gpointer data){
    const uint32_t img_w = 120;
    const uint32_t img_h = 120;
    const uint32_t circle_r = 5;
	//const double Pi = 3.14159265359;
	const double Rad360 = 6.28318530718;
	const double dot_xy[7][2] = {
		{img_w/2, img_h/2}, //center
		{img_w/2, img_h/4}, //top middle
		{img_w/2, img_h*3/4}, //bottom middle
		{img_w/4, img_h/4}, //top left corner
		{img_w*3/4, img_h/4}, //top right
		{img_w/4, img_h*3/4}, //bottom right
		{img_w*3/4, img_h*3/4} //bottom left
	};
	const uint8_t dot_indx[6][7] = {
		{1, 0, 0, 0, 0, 0, 0},
		{0, 0, 0, 1, 0, 0, 1},
		{1, 0, 0, 1, 0, 0, 1},
		{0, 0, 0, 1, 1, 1, 1},
		{1, 0, 0, 1, 1, 1, 1},
		{0, 1, 1, 1, 1, 1, 1}
	};
	uint32_t num1 = 0;
	//if(dice_num < 6)
	//	dice_num++;
	//else
	//	dice_num = 1;
	//unsigned char *img_data;
    //cairo_format_t format = CAIRO_FORMAT_ARGB32;
    //cairo_surface_t *target = cairo_image_surface_create(format, img_w, img_h);
    cairo_t *context;
    cairo_status_t status;
    //context = gdk_cairo_create(w_graph->window);
//GdkDrawable *d
context = gdk_cairo_create(GDK_DRAWABLE(widget->window));
    status = cairo_status(context);
    if(status != 0){
        printf("Error: %s\n", cairo_status_to_string(status) );
        //free(img_data);
        return FALSE;
    }

    cairo_set_source_rgba(context, 1.0, 1.0, 1.0, 1.0);
    cairo_rectangle(context, 0, 0, img_w, img_h);
    cairo_fill(context);
	cairo_stroke(context);

    cairo_set_source_rgba(context, 0.0, 0.0, 0.0, 1.0);

	//6 dice sides
	//7 possible dot locations
		//rect_diag = sqrt(pow(120, 2) + pow(120, 2));
	for(num1=0; num1<7; num1++){
		if(dot_indx[dice_num-1][num1] == 1){
			cairo_arc(context, dot_xy[num1][0], dot_xy[num1][1], circle_r, 0.0, Rad360);
			cairo_fill(context);
			cairo_stroke(context);
		}
	}
    //cairo_arc(context, img_w/2, img_h/2, circle_r, 0.0, Rad360);
		//cairo_clip(context);
	//cairo_fill(context);
	//cairo_stroke(context);

	//cairo_arc(context, img_w/3, img_h/2, circle_r, 0.0, Rad360);
	//cairo_fill(context);
	//cairo_stroke(context);

    return TRUE;
}

/*
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;
}*/
