#include "ls_gtk.h"

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

void GTK_Func(void){
	//uint32_t num1 = 0;
	struct GTK_Widgets gtk;
	gtk.main_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_container_set_border_width(GTK_CONTAINER(gtk.main_win), 2);
	gtk_window_set_default_size(GTK_WINDOW(gtk.main_win), 800, 600);
	gtk_window_set_title(GTK_WINDOW(gtk.main_win), "lsadl v0.0.1");
	gtk.main_vbox = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(gtk.main_win), gtk.main_vbox);
	gtk.main_menubar = gtk_menu_bar_new();
	gtk.main_filemenu = gtk_menu_new();
	gtk.main_file = gtk_menu_item_new_with_label("File");
	gtk.main_results = gtk_menu_item_new_with_label("API Results");
	gtk.main_quit = gtk_menu_item_new_with_label("Quit");
	
	gtk_menu_item_set_submenu(GTK_MENU_ITEM(gtk.main_file), gtk.main_filemenu);
	gtk_menu_shell_append(GTK_MENU_SHELL(gtk.main_filemenu), gtk.main_results);
	gtk_menu_shell_append(GTK_MENU_SHELL(gtk.main_filemenu), gtk.main_quit);
	gtk_menu_shell_append(GTK_MENU_SHELL(gtk.main_menubar), gtk.main_file);


	gtk_box_pack_start(GTK_BOX(gtk.main_vbox), gtk.main_menubar, FALSE, FALSE, 3);


	gtk.table = gtk_table_new(2, 3, TRUE); //h, w
	gtk.table_labels[0] = gtk_label_new("GPU");
	gtk.table_labels[1] = gtk_label_new("MEM");
	gtk.gpu_adj = (GtkAdjustment *)gtk_adjustment_new(START_GPU, MIN_GPU, MAX_GPU, 1.0, 1.0, 0.0);
	gtk.mem_adj = (GtkAdjustment *)gtk_adjustment_new(START_MEM, MIN_MEM, MAX_MEM, 1.0, 1.0, 0.0);
	gtk.gpu_button = gtk_spin_button_new(gtk.gpu_adj, 1, 1);
	gtk.mem_button = gtk_spin_button_new(gtk.mem_adj, 1, 1);
	gtk.apply_button = gtk_button_new_with_label("Apply");

	gtk_table_attach(GTK_TABLE(gtk.table), gtk.table_labels[0], 0, 1, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	gtk_table_attach(GTK_TABLE(gtk.table), gtk.table_labels[1], 1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	gtk_table_attach(GTK_TABLE(gtk.table), GTK_WIDGET(gtk.gpu_button), 0, 1, 1, 2, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	gtk_table_attach(GTK_TABLE(gtk.table), GTK_WIDGET(gtk.mem_button), 1, 2, 1, 2, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	gtk_table_attach(GTK_TABLE(gtk.table), gtk.apply_button, 2, 3, 1, 2, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);

	gtk.scrolled_win = gtk_scrolled_window_new(NULL, NULL);
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gtk.scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(gtk.scrolled_win), gtk.table);
	gtk_box_pack_end(GTK_BOX(gtk.main_vbox), gtk.scrolled_win, TRUE, TRUE, 3);

	g_signal_connect(gtk.main_win, "destroy", G_CALLBACK(exit_cb), NULL);
	g_signal_connect(G_OBJECT(gtk.main_quit), "activate", G_CALLBACK(exit_cb), NULL);
	g_signal_connect(G_OBJECT(gtk.main_results), "activate", G_CALLBACK(API_Funcs_Found_Popup_cb), NULL);
	//"button-release-event"
	g_signal_connect(G_OBJECT(gtk.apply_button), "clicked", G_CALLBACK(apply_cb), (gpointer)&gtk);
	gtk_widget_show_all(gtk.main_win);
	gtk_main();

}




gboolean exit_cb(GtkWidget *widget, gpointer data){
	gtk_main_quit();
	return TRUE;
}

gboolean apply_cb(GtkWidget *widget, gpointer data){
	uint32_t gpu = (uint32_t)gtk_spin_button_get_value_as_int( (GtkSpinButton *)(((struct GTK_Widgets *)data)->gpu_button) );
	uint32_t mem = (uint32_t)gtk_spin_button_get_value_as_int( (GtkSpinButton *)(((struct GTK_Widgets *)data)->mem_button) );
	uint32_t s_size = strlen("nvidia-settings -a GPU2DClockFreqs=1000,1000")+1;
	char *setting = malloc(sizeof(char)*s_size);
	//(void)memset(setting, '\0', s_size);
	//(void)sprintf(setting, "GPUOverclockingState=1");
	//printf("%s\n", setting);

	//system("

	//(void)sprintf(setting, "nvidia-settings -a GPU2DClockFreqs=%u,%u", gpu, mem);
	//printf("%s\n", setting);
	//system("nvidia-settings -a GPUOverclockingState=1");
	//system(setting);

	//printf("set:: GPU: %u MEM: %u\n", gpu, mem);
	gtk_widget_show_all(((struct GTK_Widgets *)data)->main_win);
	//nvidia-settings -a GPUOverclockingState=1
	//nvidia-settings -a GPU2DClockFreqs=200,800
	free(setting);

	return TRUE;
}

gboolean API_Funcs_Found_Popup_cb(GtkWidget *widget, gpointer data){
	int num1 = 0;
    GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_set_border_width(GTK_CONTAINER(win), 2);
    gtk_window_set_default_size(GTK_WINDOW(win), 600, 400);
    gtk_window_set_title(GTK_WINDOW(win), "API Status");
    GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(win), vbox);
    //player  type  min_dice_will_roll  min_score_will_keep
    GtkWidget *top_table = gtk_table_new(LSADL_FUNCS, 3, TRUE);
    //ng.top_table = gtk_table_new(4, gs.Num_Players+2, TRUE);
	GtkWidget *top_table_labels[3];
    top_table_labels[0] = gtk_label_new("Function:");
    top_table_labels[1] = gtk_label_new("Status:");
    top_table_labels[2] = gtk_label_new("Note:");
    //top_table_labels[3] = gtk_label_new("Min score will keep");
	GtkWidget *all_labels[LSADL_FUNCS*3];

    gtk_table_attach(GTK_TABLE(top_table), top_table_labels[0],  0, 1, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
    gtk_table_attach(GTK_TABLE(top_table), top_table_labels[1],  1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
    gtk_table_attach(GTK_TABLE(top_table), top_table_labels[2],  2, 3, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
    //gtk_table_attach(GTK_TABLE(top_table), top_table_labels[3],  3, 4, 0, 1, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);

	for(num1=0; num1<LSADL_FUNCS; num1+=3){
		all_labels[num1] = gtk_label_new((const gchar *)ADL_Func_Names[num1]);
		if(ADL_Func_Enabled[num1] == 1)
			all_labels[num1+1] = gtk_label_new((const gchar *)"Enabled");
		else
			all_labels[num1+1] = gtk_label_new((const gchar *)"Disabled");
		if(ADL_Func_Notes[num1] == FUNC_FOUND_IN_API)
			all_labels[num1+2] = gtk_label_new((const gchar *)"Found in API");
		else if(ADL_Func_Notes[num1] == FUNC_MISSING_FROM_API)
			all_labels[num1+2] = gtk_label_new((const gchar *)"Missing From API");
		else
			all_labels[num1+2] = gtk_label_new((const gchar *)"Disabled by LSADL");
		gtk_table_attach(GTK_TABLE(top_table), all_labels[num1],  0, 1, num1+1, num1+2, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
		gtk_table_attach(GTK_TABLE(top_table), all_labels[num1+1],  1, 2, num1+1, num1+2, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
		gtk_table_attach(GTK_TABLE(top_table), all_labels[num1+2],  2, 3, num1+1, num1+2, GTK_EXPAND|GTK_FILL, 0, GTK_EXPAND|GTK_FILL, 0);
	}
	//bottom_table = gtk_table_new(4, 5, TRUE);
	GtkWidget *close_button = gtk_button_new_with_label("Close");
	
    GtkWidget *scrolled_win = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_win), top_table);
    gtk_box_pack_start(GTK_BOX(vbox), scrolled_win, TRUE, TRUE, 3);
    gtk_box_pack_end(GTK_BOX(vbox), close_button, FALSE, FALSE, 3);
	g_signal_connect(win, "destroy", G_CALLBACK(on_destroy), (gpointer)(win));
	g_signal_connect(G_OBJECT(close_button), "clicked", G_CALLBACK(on_destroy), (gpointer)(win));
	gtk_widget_show_all(win);

	return TRUE;
}