from ast import If
import sqlite3
import time
import threading
import tkinter
from turtle import left, width
import modules.User as User
import sys
import tkinter as tk
from direct import task
from tkinter import Scale, StringVar
from random import random

def button_event_close():
	print("Programm wird geschlossen")
	
	return 0;

def guithread():
	
	window_size_x = 1024
	window_size_y = 786
	
	label_logged_in = tk.Label
	label_highscore = tk.Label
	label_lastlogin = tk.Label

	
	#Hauptfenster-Block   
	window1 = tk.Tk() #Instanzierung von Fensterelement
	window1.wm_title("Snake v1.0")
	window1.geometry("1024x768")
	window1.attributes("-topmost", True)


	print("Erstelle User-Klassen Objekt")
	us = User.User()
	
	#Mit der Parameterübergabe der Klasseninstantz Tk, kann auch in einer Methode oder Funktion die Instantz direkt manipuliert werden!
	def mainwindow_test(mainwindow : tk.Tk):
		mainwindow.quit()
		pass

	def close_mainwindow():
		print("Programm wird geschlossen!")
		window1.quit()
			
	def read_user(username, schaltf2:tk.Label, label_user_exists:tk.Label, all_listed_radiob:list): #Eingabeprüfung, bei Exception bei leerem String oder Eingabefeld
		unametemp = username #eingabefeld_wert.get()
		if(len(unametemp) != 0):       
			print("Lese Nutzereingabe: ", unametemp, "\n")
			if(us.select(unametemp) == True):
				welcome_msg = "Willkommen, " + us.getusername()
				highscore_msg = "Dein letzter Highscore lag bei: " + str(us.gethighscore()) + " Punkten"
				lastlogin_msg = "Du warst das letzte Mal am: " + us.getlastlogin() + " am Spielen"
				label_logged_in = tk.Label(window1, text=welcome_msg)
				label_highscore = tk.Label(window1, text=highscore_msg)
				label_lastlogin = tk.Label(window1, text=lastlogin_msg)
				label_logged_in.place(x=180, y=50)
				label_highscore.place(x=180, y=80)
				label_lastlogin.place(x=180, y=110)
				label_user_exists.destroy()
				schaltf2.destroy()
				
				#Zerstört alle gezeichneten Insantzen von Radiobuttons
				for radiobutton in all_listed_radiob:
					radiobutton.destroy()
			return
		else:
			print("Bitte etwas eingeben... Das Feld war leer!") 
			return
		
	def input_new_user(*events):
		
		#Eingabefenster-Block
		subwindow1 = tk.Toplevel(window1)
		subwindow1.wm_title("Eingabe")
		subwindow1.geometry("400x200")
		subwindow1.resizable(0,0) #Blockiert ein Skalieren des Fensters
		window1.attributes("-topmost", False)
		subwindow1.attributes("-topmost", True)
		subwindow1.lift() #Hebt das Child-Fenster zumsammen mit attributes in den Vordergrund


		eingabewert = StringVar(subwindow1)
		def check_input():
			if(len(eingabewert.get()) <= 0):
				print("Es wurde keine Eingabe gemacht!")
			else:
				print(eingabewert.get())
				us.createuser(eingabewert.get())
				subwindow1.destroy()
				build_mainwindow(window1)
			return
		
		textlabel = tk.Label(subwindow1, text="Bitte gib deinen Benutzernamen ein: ")
		label_new_user = tk.Entry(subwindow1, width=40, textvariable=eingabewert)
		button_ok = tk.Button(subwindow1, text="Erstellen", height=1, width=10, command=check_input)
		button_abort = tk.Button(subwindow1, text="Abbrechen", command=subwindow1.destroy)
		
		textlabel.place(x=5, y=5)
		label_new_user.place(x=6, y=25)
		button_ok.place(x=5, y=150)
		button_abort.place(x=140, y=150)
		#label_new_user.place(x=window_size_x*0.25, y=window_size_y*0.6)

	def build_mainwindow(window1 : tk.Tk):
		#Programmüberschrift
		label1 = tk.Label(window1, text="Snake v1.0 written by CB") #Fenster Funktion für Textausgabe
		label1.grid(row=0, column=0)
		#Schaltflächen und Buttons
		schaltf1 = tk.Button(window1, text="Fenster schließen", command=close_mainwindow)
		schaltf1.place(x=5, y=window_size_y-50)

		aktuell_ausgewaehlt =""
		
		
		
		if(us.checkuserdb() == False):
			#Anmeldedialog
			print("Noch kein Nutzer angelegt!")
			#messagebox.Message(master=None, message="Es wurde noch kein Spieler angelegt!", type=messagebox.OK, icon=messagebox.WARNING).show()
			input_new_user()
	
		elif(us.checkuserdb() == True):
			print("Nutzer bereits vorhanden, wähle einen aus!")
			#us.listallusers()

			users = us.listallusers()
			ausgewaehlt = tk.StringVar()

			ausgewaehlt.set(0)
			def value_select():
				aktuell_ausgewaehlt = str(ausgewaehlt.get())
				print(aktuell_ausgewaehlt)
				return 0
			
			print (aktuell_ausgewaehlt)
	
			all_listed_radiob = list()

			i = 0 
			for einzelwert in users:
				radiob = tk.Radiobutton(window1, text=einzelwert, value=einzelwert, variable=ausgewaehlt, command=value_select) 
				all_listed_radiob.append(radiob)
				print (users)
				radiob.place(x=5, y=150+i)
				i+=30
		 
			print("Alle Radiobuttons gesetzt!")  
		
			def login_user():
				print("Melde ausgewählten Nutzer an!\n")
				read_user(ausgewaehlt.get(), schaltf2, label_user_exists, all_listed_radiob)
				return 0

			label_user_exists = tk.Label(window1, text="Wähle deinen Spieler aus: ")
			label_user_exists.place(x=2, y=30)
			#eingabefeld_wert=tk.StringVar()
		
			#eingabefeld=tk.Entry(window1, textvariable=eingabefeld_wert)
			#eingabefeld.place(x=2, y=80)
			schaltf2 = tk.Button(window1, text="Auswählen", command=login_user)
			schaltf2.place(x=150, y=75)

	build_mainwindow(window1)

	#Nützliches Feature um zeitgesteuerte Events in Mainloop ausführen zu können
	def message():
		print('Keep yourself hyderated.')
		window1.after(2000, message)

	#window1.after(2000, message)
	window1.mainloop() #Hauptschleife für gezeichnetes Fenster
	us.__del__() #Stellt sicher, dass User-Klassenobjekt im korrekten Thread beendet wird
	return 0;



class woscht(User.User):
	def __init__(self) -> None:
		UserInstanz = User
		print("Unterklasser der Userklasse erstellt!\n")
		print("So funktioniert die Klassenvererbung in Python...")
		print("Dies ermöglicht eine modulare Aufbauweise ohne sich ständig bei kleineren Abweichung wiederholen zu müssen ober ganze Abschnitte zu kopieren und einzufügen\n")
		
	def Testfunkiton(self):
		print("Das ist eine Funktion, welche ausgeführt wird in einer Kindklasse. Sie existiert nicht in der Elternklasse!\n")
		pass
	def Testfunktion2(self):
		print("Weitere Funktion, welche bei initialisieren der Klasse aufgerufen wird.\n")
	pass
	
class woscht2(woscht):
	def __init__(self) -> None:	
		woscht().Testfunktion2()
		print("Unterklasse der Woschtklasse\n")
		print("Die stellt eine Vererbung auf eine Vererbung dar. Hier können weitere Ergänzungen vorgenommen werden\n")
	pass

#Eine Schleife, welche unter Zuhilfenahme einer Rekursion entsteht.
def recursive(zahl):
	if(zahl==100):
		print("Vorgang abgeschlossen!")
		return
	elif(zahl <= 100):
		zahl += 1
		time.sleep(0.001)
		print(zahl, end="\r")
		return recursive(zahl)
	else:
		print("Ergeniss konnte nicht erreicht werden!")
		return

	
def main():
	t = threading.Thread(target=guithread ,args=())
	t.start()
	#recursive(0)
	#while(True):
	#	pass

	"""
	test = woscht()
	test.getusername()
	
	test2 = woscht2()
	test2.Testfunkiton()
	
	testtu = list()

	#Mit dieser Funktion können mehrer Instanzen einer KLasse erstellt werden und im späteren Verlauf über den Listenindex bearbeitet werden.
	for i in range(5):
		testtu.append(woscht2())

	print("Es wurden folgenden Klassen erstellt: ")
	print (len(testtu))
	

	for i in testtu:
		print(i)
	"""
	
	
#    FH = open("user.txt", "w")
#    FH.write(us.getusername())
#    FH.close()
	time.sleep(1)

	return 0

if __name__ == "__main__":
	main()
	

