GFileMonitor *exp_paymentfile = NULL;

/*
 * Diese Methode erstellt aus dem übergebenen Paymentfile Quittungen im übergebenen Arbeitsverzeichnis und druckt diese aus.
 */
void quittungen_aus_paymentfile_erstellen(GFile *paymentfile, gchar *workpath, gchar *paymentfile_name){
	// tex-File anlegen
	GFile *texfile = NULL;
	texfile = g_file_new_for_path(g_strdup_printf("/ramdisk/%i/%s.pay.tex", getuid(), paymentfile_name));
	if (g_file_query_exists(texfile, NULL)) g_file_delete(texfile, NULL, NULL); // löschen, wenn schon vorhanden
	// Datei anlegen und OutputStream initialisieren
	GOutputStream *texcontent = NULL;
	texcontent = G_OUTPUT_STREAM(g_file_create(texfile, 0, NULL, NULL));
	
	// Array anlegen, in dem die Einträge des Payment-File gespeichert werden
	struct payment_eintrag{gchar *Computer; gchar *Name; gdouble Profit;} teilnehmer[num_clients];
	// Dateigröße des Paymentfiles auslesen
	gint64 dateigroesse = g_file_info_get_size(g_file_query_info(paymentfile, G_FILE_ATTRIBUTE_STANDARD_SIZE, 0, NULL, NULL));
	
	// Inhalt des Paymentfile einlesen
	char paymentfile_content[dateigroesse];
	GInputStream *payment_stream = NULL;
	payment_stream = G_INPUT_STREAM(g_file_read(paymentfile, NULL, NULL));
	g_input_stream_read(payment_stream, paymentfile_content, dateigroesse, NULL, NULL);
	g_input_stream_close(payment_stream, NULL, NULL);
//	g_object_unref(paymentfile); // Inhalt von paymentfile wieder löschen
	
	// paymentfile_content in Zeilen aufteilen
	gchar **teilnehmer_array = NULL;
	teilnehmer_array = g_strsplit(paymentfile_content, "\n", 0);
	
	// Zeilen in Stücke aufteilen (waren durch Tab getrennt)
	gchar **zeileninhalte = NULL;
	int eintrag = 0; // der wie vielte Eintrag?
	gdouble auszahlungs_summe = 0; // wird direkt mit berechnet
	int i;
	for(i=0; teilnehmer_array[i]; i++){
			g_message("Zerlege %s", teilnehmer_array[i]);
		zeileninhalte = g_strsplit(teilnehmer_array[i], "\t", 0);

		// testen, ob das 1. Token eine Zahl ist
//		if (zeileninhalte[1] != NULL && g_strcmp0(g_strndup(zeileninhalte[1], 6), "client") == 0){
		if (zeileninhalte[0] != NULL && g_ascii_strtoull(zeileninhalte[0], NULL, 0) == eintrag+1){

			// in payment_eintrag schreiben
			teilnehmer[eintrag].Computer = zeileninhalte[1];
			teilnehmer[eintrag].Name = zeileninhalte[3];
			teilnehmer[eintrag].Profit = g_ascii_strtod(zeileninhalte[4], NULL);
			auszahlungs_summe += teilnehmer[eintrag].Profit;
			eintrag++;
		}
//		g_free(zeileninhalte); // Zeileninhalte wieder löschen
	}
//	g_free(teilnehmer_array); // Inhalt von teilnehmer_array wieder löschen
	
	// Latex Startsequenz aus gconf auslesen und schreiben, dabei EXPERIMENTNAME durch paymentfile_name ersetzen
	char temptext[2000];
	gsize laenge;
	gchar **latex_header = NULL;
	latex_header = g_strsplit(gconf_client_get_string(gconf_client, "/apps/labcontrol/user_config/receipts_latex_header", NULL), "EXPERIMENTNAME", 3);
	laenge = g_strlcpy(temptext, g_strjoin(NULL, latex_header[0], paymentfile_name, latex_header[1], paymentfile_name, latex_header[2], NULL), sizeof(temptext));
	g_output_stream_write(texcontent, temptext, laenge, NULL, NULL);
	
	// Einträge der Zusammenfassungstabelle schreiben
	for (i=0; i< eintrag; i++){
		laenge = g_strlcpy(temptext, g_strdup_printf("%s & %s & %s & %.2f \\EUR\\\\\n", paymentfile_name, teilnehmer[i].Computer, teilnehmer[i].Name, teilnehmer[i].Profit), sizeof(temptext));
		g_output_stream_write(texcontent, temptext, laenge, NULL, NULL);
	}

	// Latex Zwischensequenz schreiben
	laenge = g_strlcpy(temptext, g_strdup_printf("\\hline &&& %.2f\\EUR\\end{tabular}\n\n%%Einzelquittungen\n", auszahlungs_summe), sizeof(temptext));
	g_output_stream_write(texcontent, temptext, laenge, NULL, NULL);

	// Einzelquittungen schreiben
	for (i=0; i< eintrag; i++){
		if (teilnehmer[i].Profit >=0){
		laenge = g_strlcpy(temptext, g_strdup_printf("\\GAINRECEIPT{%s}{%s}{%.2f}\n", teilnehmer[i].Computer, teilnehmer[i].Name, teilnehmer[i].Profit), sizeof(temptext));
		}
		else {
		laenge = g_strlcpy(temptext, g_strdup_printf("\\LOSSRECEIPT{%s}{%s}{%.2f}\n", teilnehmer[i].Computer, teilnehmer[i].Name, teilnehmer[i].Profit), sizeof(temptext));
		}
		g_output_stream_write(texcontent, temptext, laenge, NULL, NULL);
	}
	
	// Latex Endsequenz schreiben
	laenge = g_strlcpy(temptext, g_strdup_printf("\\end{document}"), sizeof(temptext));
	g_output_stream_write(texcontent, temptext, laenge, NULL, NULL);
	
	// GOutputStream schließen
	g_output_stream_close(texcontent, NULL, NULL);
//	g_object_unref(texfile); // Inhalt von texfile wieder löschen
	
	// tex-File mit latex übersetzen, in ps umwandeln und anzeigen 
	gnome_execute_shell(NULL, g_strdup_printf("cd /ramdisk/%i; latex -interaction batchmode %s.pay.tex; dvips -q* -o %s/%s.ps %s.pay.dvi; lpr %s/%s.ps & %s %s/%s.ps & ps2pdf %s/%s.ps %s/%s.pdf", getuid(), paymentfile_name, workpath, paymentfile_name, paymentfile_name, workpath, paymentfile_name, gconf_client_get_string(gconf_client, "/apps/labcontrol/user_config/PS_viewer", NULL), workpath, paymentfile_name, workpath, paymentfile_name, workpath, paymentfile_name));	
	// Erfolg
	g_message(_("Receipt with %s/%s.pay succesfully created."), workpath, paymentfile_name);
	g_free(workpath); // Inhalt von workpath wieder löschen
	g_free(paymentfile_name); // Inhalt von paymentfile_name wieder löschen
}





/*
 * Diese Funktion wird aufgerufen, wenn das Paymentfile auftaucht. Sie generiert dann eine Quittung.
 */
void auto_quittung_generieren(GFileMonitor *exp_paymentfile, GFile *paymentfile, GFile *other_file, GFileMonitorEvent event_type, gpointer user_data)
{
	if ((event_type == G_FILE_MONITOR_EVENT_CREATED) & (gtk_toggle_button_get_active(auto_quittung_checkbutton))){
//		sleep
		g_message(_("The expected paymentfile was created. Will generate and print the receipts now."));
		quittungen_aus_paymentfile_erstellen(paymentfile, gconf_client_get_string(gconf_client, "/apps/labcontrol/temp/last_ztree_working_path", NULL), gconf_client_get_string(gconf_client, "/apps/labcontrol/temp/last_ztree_start_time", NULL));
		g_file_monitor_cancel(exp_paymentfile);
	}
}


/*
 * erwartetes Paymentfile eintragen und überwachen, ob eine solche Datei auftaucht
 */
void watch_expected_paymentfile(gchar path_to_exp_paymentfile[500]){
	// in Textfeld eintragen
	gtk_entry_set_text(GTK_ENTRY(glade_xml_get_widget (gxml, "expected_paymentfile")), g_strdup_printf("%s.pay", path_to_exp_paymentfile));
	// FileMonitor starten
	GFile *expected_file = NULL;
	expected_file = g_file_new_for_path(g_strdup_printf("%s.pay", path_to_exp_paymentfile));
	exp_paymentfile = g_file_monitor_file(expected_file, G_FILE_MONITOR_NONE, NULL, NULL);
	g_signal_connect(exp_paymentfile, "changed", G_CALLBACK(auto_quittung_generieren), NULL);
}


/*
 * startet oder beendet den entsprechenden GFileMonitor für das aktuelle Paymentfile.
 */
void checkbox_auto_quittungen_toggled(){
	if(gtk_toggle_button_get_active(auto_quittung_checkbutton)){
		// Checkbox ist aktiviert, FileMonitor starten
		{gchar path_to_exp_paymentfile[500];
		strcpy(path_to_exp_paymentfile, g_strdup_printf("%s/%s", gconf_client_get_string(gconf_client, "/apps/labcontrol/temp/last_ztree_working_path", NULL), gconf_client_get_string(gconf_client, "/apps/labcontrol/temp/last_ztree_start_time", NULL)));
		if (!g_file_query_exists(g_file_new_for_path(g_strdup_printf("%s.ps", path_to_exp_paymentfile)), NULL)){
			watch_expected_paymentfile(path_to_exp_paymentfile);
			g_message(_("No receipts found for the last expected paymentfile %s. Will print receipts after its creation."), path_to_exp_paymentfile);
		}
		}
	}
	else{
		// Checkbox wurde deaktiviert, FileMonitor beenden
		g_file_monitor_cancel(exp_paymentfile);
		g_message(_("No automatical receipts will be created in future."));
	}
}





/*
 * Quittungen drucken, dabei wird zuerst nach einem Paymentfile gesucht, dass 
 * zur letzten gestarteten zTree-Instanz gehört. Wird dies nicht gefunden, 
 * wird nachgefragt, welches PAymentfile genutzt werden soll.
 */
void quittungen_drucken(){
	// hier letzten benutzten Pfad und Datei auslesen
	char *workpath=NULL, *paymentfile_name=NULL;
	workpath = gconf_client_get_string(gconf_client, "/apps/labcontrol/last_ztree_working_path", NULL);
	paymentfile_name = gconf_client_get_string(gconf_client, "/apps/labcontrol/last_ztree_start_time", NULL);
	
	// Prüfen, ob erwartetes Paymentfile existiert (über GIO)
	GFile* paymentfile = NULL;
	paymentfile = g_file_new_for_path(g_strdup_printf("%s/%s.pay", workpath, paymentfile_name));
	if (!g_file_query_exists(paymentfile, NULL)){ 
		// erwartetes Paymentfile existiert nicht, über Dialog user nach anderem fragen
		g_message(_("Expected paymentfile %s/%s.pay does not exist. Will ask."), workpath, paymentfile_name);
		GtkWidget *dialog;
		dialog = gtk_file_chooser_dialog_new (_("Open File"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN,
							  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
		gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
		GtkFileFilter *filter;
		filter = gtk_file_filter_new();
		gtk_file_filter_set_name(filter, _("Only zTree's YYMMTT_HHMM.pay files"));
		gtk_file_filter_add_pattern(filter, "??????_????.pay");
		gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
		if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT){
			paymentfile = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(dialog));
			workpath = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(dialog));
			// Pfad vorher und Dateiendung wegschneiden, damit der rohe Dateiname z.B. als Experimentname bleibt
			gchar **pathelements = NULL;
			pathelements = g_strsplit(g_strreverse(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (dialog))), "/", 0);
			paymentfile_name = g_strndup(g_strreverse(pathelements[0]), 11);
			g_message(_("Use %s/%s.pay"), workpath, paymentfile_name);
			gtk_widget_destroy (dialog);
//			g_free(pathelements);
		}
		else{
			gtk_widget_destroy (dialog);
//			g_object_unref(paymentfile); // Inhalt von paymentfile wieder löschen
			g_free(workpath); // Inhalt von workpath wieder löschen
			g_free(paymentfile_name); // Inhalt von paymentfile_name wieder löschen
			return;
		}
	}
	
	quittungen_aus_paymentfile_erstellen(paymentfile, workpath, paymentfile_name);
}


void showup_quittung_drucken(){
	// InputDialog anzeigen
}

