/*
 * Copyright (C) Henning Prömpers 2008 <henning.proempers@uni-jena.de>
 *
 * In dieser Datei befinden sich die Methoden, die beim Klick auf einen Button
 * oder einen Menüeintrag aufgerufen werden. Sie bewirken alle Aktionen auf dem
 * lokalen Server.
 */


void start_ztree(){
	// Prüfen, ob überhaupt eine zTree-Version gewählt ist
	if (gtk_combo_box_get_active_text(ztree_version_combobox) == NULL){
		GtkWidget *dialog;
		dialog = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
			_("You have to select a zTree version in the combobox in the right top corner. zTree will not be started."));
		gtk_dialog_run(GTK_DIALOG (dialog));
		gtk_widget_destroy(dialog);
		return;
	}	
	// Wenn bereits ein Prozess namens zTree läuft, fragen, ob wirklich ztree gestartet werden soll
	if (ztree_running()){
		// Nachfragen, ob wirklich eine weitere Instanz gestartet werden soll
		GtkWidget *dialog;
		dialog = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
			_("A process called ztree.exe is still running. Do you really want to start a new zTree instance? If you are not sure, press NO."));
		if (gtk_dialog_run(GTK_DIALOG (dialog)) != GTK_RESPONSE_YES){
			gtk_widget_destroy (dialog);
			return; // wenn NEIN: Abbruch;
		}
		gtk_widget_destroy(dialog);
	}
	// Version auslesen und festschreiben, damit die Clients die gleiche Version haben
	char current_ztree_version[20];
	strcpy(current_ztree_version, gtk_combo_box_get_active_text(ztree_version_combobox));
	gconf_client_set_string(gconf_client, "/apps/labcontrol/temp/current_ztree_version", current_ztree_version, NULL);

	// Arbeitsverzeichnis für Experimentdaten auslesen und festschreiben
	char work_path[256];
	sprintf(work_path, "%s", gtk_file_chooser_get_filename(ztree_workpath_filechooserbutton));
	gconf_client_set_string(gconf_client, "/apps/labcontrol/temp/last_ztree_working_path", work_path, NULL);
	
	// Prüfen, ob mit oder ohne ramdisk und entsprechenden temp_path setzen
	char temp_path[256];
	if(gtk_toggle_button_get_active(ztree_use_ramdisk_checkbutton)){sprintf(temp_path, "/ramdisk/%i", getuid());}
	else {strcpy(temp_path, work_path);}	

	// ztree starten
	gnome_execute_shell(g_strdup_printf("/opt/%s/", current_ztree_version), g_strdup_printf("cd %s; wine /opt/%s/ztree.exe /datadir Z:/%s /privdir Z:/%s /gsfdir Z:/%s /tempdir Z:/%s /leafdir Z:/%s", work_path, current_ztree_version, work_path, work_path, temp_path, temp_path, work_path));
	g_message(_("zTree were started with the following command: cd %s; wine /opt/%s/ztree.exe /datadir Z:/%s /privdir Z:/%s /gsfdir Z:/%s /tempdir Z:/%s /leafdir Z:/%s"), work_path, current_ztree_version, work_path, work_path, temp_path, temp_path, work_path);
	
	// Zeit festschreiben
	time_t t = time(NULL);	struct tm *lt; lt = localtime (&t);
	gconf_client_set_string(gconf_client, "/apps/labcontrol/temp/last_ztree_start_time", g_strdup_printf("%02d%02d%02d_%02d%02d", lt->tm_year-100, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min), NULL);// Da Jahreszahlen seit 1900 angegeben werden, 100 abziehen (2100 dann auf -200 setzen :))
	gconf_client_suggest_sync(gconf_client, NULL);
//	g_free(lt); // Inhalt von lt wieder löschen

	// erwartetes Paymentfile eintragen und FileMonitor sterten (auch bei Initialisierung)
	watch_expected_paymentfile(g_strdup_printf("%s/%02d%02d%02d_%02d%02d", work_path, lt->tm_year-100, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min));
}





void local_zleaf_start(){
	// Prüfen, ob lokal ein zTree-Server läuft, dann Warnmeldung und evtl. abbruch
	if (!ztree_running()){
		// Nachfragen, ob wirklich ein Client, der sich nicht verbinden kann, gestartet werden soll
		GtkWidget *dialog;
		dialog = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
			_("No zTree is running on this server. Do you really want to start zLeafs, even though they will fail to connect the server? If you are not sure, press NO."));
		if (gtk_dialog_run(GTK_DIALOG (dialog)) != GTK_RESPONSE_YES){
			gtk_widget_destroy (dialog);
			return; // wenn NEIN: Abbruch;
		}
		gtk_widget_destroy(dialog);
	}

	// if there are still zleafs running on the server, use the first free local___ number
	gnome_execute_shell(NULL, g_strdup_printf("wine /opt/%s/zleaf.exe /name local%i", 
				gconf_client_get_string(gconf_client, "/apps/labcontrol/temp/current_ztree_version", NULL), free_local_zleaf_number()));

	
}



/*
 * media4ztree synchronisieren
 */

void sync_media4ztree(){
	// Wenn nicht alle Rechner an sind, abbrechen
	if (all_clients_running(TRUE)){
		// Wenn Client-Nr einstellig, so wird durch den Ausdruck (client_no<10)?"0":"" noch eine 0 eingefügt
		int i;
		for (i=1; i<=num_clients; i++){
			gnome_execute_shell(NULL, g_strdup_printf("cd ~; rsync --delete -re 'ssh -i %s -o StrictHostKeyChecking=no' /media4ztree/ %s@%s:/home/%s/media4ztree",
						get_publickey_path_user(), get_user_name_on_clients(),
			            get_hostname_of_client(i), get_user_name_on_clients()));
			g_message(_("media4ztree was synchonized with client %i."), i);
		}
	}
	else {
		GtkWidget *dialog;
		dialog = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
			_("All clients needs to be running, before media data can be synchronized."));
		gtk_dialog_run(GTK_DIALOG (dialog));
		gtk_widget_destroy(dialog);
	}
}

/*
 * Firefox mit ORSEE starten
 */
void show_orsee(){
	gnome_execute_shell(NULL, gconf_client_get_string(gconf_client, "/apps/labcontrol/user_config/ORSEE_command", NULL));
}

/*
 * Firefox mit der Webcam starten
 */
void show_webcam(){
	gnome_execute_shell(NULL, gconf_client_get_string(gconf_client, "/apps/labcontrol/user_config/webcam_command", NULL));
}

/*
 * Ordner mit Vordrucken zeigen
 */
void show_vordrucke(){
	gnome_execute_shell(NULL, gconf_client_get_string(gconf_client, "/apps/labcontrol/user_config/preprints_command", NULL));
}