extends Control

onready var ServerLineEdit = get_node("Panel/TabContainer/Multiplayer/Panel/ServerLineEdit")
onready var ServerList = get_node("Panel/TabContainer/Multiplayer/Panel/ServerList")
onready var AddonList = get_node("Panel/TabContainer/Addons/AddonPanel/AddonList")
onready var DirectConnectCheck = get_node("Panel/TabContainer/Multiplayer/Panel/DCCheck")
onready var ExecLineEdit = get_node("Panel/TabContainer/Settings/ExecPanel/ExecLineEdit")
onready var FullscreenOptions = get_node("Panel/TabContainer/Settings/DisplayPanel/FullscreenOptions")
# 0 - Windowed (Default)
# 1 - Fullscreen
# 2 - Borderless
onready var RenderOptions = get_node("Panel/TabContainer/Settings/DisplayPanel/RenderOptions")
# 0 - Software (Default)
# 1 - OpenGL
onready var CustomParameters = get_node("Panel/TabContainer/Settings/OtherPanel/ParameterTextEdit")


# Called when the node enters the scene tree for the first time.
func _ready():
	if OS.get_name() == "X11":
		$ExecDialog.set_filters(PoolStringArray([]))
		$ExecDialog.set_current_file("srb2kart")
		$ExecDialog.set_current_path("/srb2kart")
		
	load_data()
	var dir = Directory.new()
	dir.open("user://")
	dir.make_dir("addonlists")
	pass # Replace with function body.

func load_data():
	var file = File.new()
	file.open("user://nyoom.cfg", File.READ)
	if file.file_exists("user://nyoom.cfg"):
		file.open("user://nyoom.cfg", File.READ)
		var data = file.get_var(true)
		if data.has("Server"):
			ServerLineEdit.text = data["Server"]
		if data.has("ServerList"):
			ServerList.items = data["ServerList"]
		if data.has("AddonList"):
			AddonList.items = data["AddonList"]
		if data.has("Executable"):
			ExecLineEdit.text = data["Executable"]
		if data.has("DirectConnect"):
			DirectConnectCheck.pressed = data["DirectConnect"]
		if data.has("Nickname"):
			$Panel/TabContainer/Multiplayer/Panel/NicknameLineEdit.text = data["Nickname"]
		if data.has("FullscreenMode"):
			FullscreenOptions.selected = data["FullscreenMode"]
		if data.has("RenderMode"):
			RenderOptions.selected = data["RenderMode"]
		if data.has("CustomParameters"):
			CustomParameters.text = data["CustomParameters"]
		file.close()

func save_data():
	var file = File.new()
	file.open("user://nyoom.cfg", File.WRITE)
	var data = {}
	data["Server"] = ServerLineEdit.text
	data["ServerList"] = ServerList.items
	data["AddonList"] = AddonList.items
	data["Executable"] = ExecLineEdit.text
	data["DirectConnect"] = DirectConnectCheck.pressed
	data["Nickname"] = $Panel/TabContainer/Multiplayer/Panel/NicknameLineEdit.text
	data["FullscreenMode"] = $Panel/TabContainer/Settings/DisplayPanel/FullscreenOptions.selected
	data["RenderMode"] = $Panel/TabContainer/Settings/DisplayPanel/RenderOptions.selected
	data["CustomParameters"] = CustomParameters.text
	file.store_var(data)
	file.close()


# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
#	pass


func _on_LaunchButton_pressed():
	var file = File.new()
	if !file.file_exists(ExecLineEdit.text):
		$ExecDialog.popup()
		if ExecLineEdit.text == "":
			$Dialog.info("Executable not configured. Please select your SRB2Kart executable.")
		else:
			$Dialog.error("The designated executable couldn't be found. Please select a valid SRB2Kart executable. ")
		return
	start_game()


func start_game():
	var args = PoolStringArray([])
	if ServerLineEdit.text != "" and DirectConnectCheck.pressed:
		args.append("-connect")
		args.append(ServerLineEdit.text)
	if $Panel/TabContainer/Multiplayer/Panel/NicknameLineEdit.text != "":
		args.append("+name")
		args.append($Panel/TabContainer/Multiplayer/Panel/NicknameLineEdit.text)
	match $Panel/TabContainer/Settings/DisplayPanel/RenderOptions.selected:
		0:
			args.append("-software")
		1:
			args.append("-opengl")
	match $Panel/TabContainer/Settings/DisplayPanel/FullscreenOptions.selected:
		0:
			args.append("-win")
			args.append("-width")
			args.append("1280")
			args.append("-height")
			args.append("800")
		1:
			args.append("+fullscreen 1")
			args.append("-width")
			args.append(OS.get_screen_size().x)
			args.append("-height")
			args.append(OS.get_screen_size().y)
		2:
			args.append("-win")
			args.append("-borderless")
			args.append("-width")
			args.append(OS.get_screen_size().x)
			args.append("-height")
			args.append(OS.get_screen_size().y)
	if CustomParameters.text != "":
		for line in CustomParameters.get_parameters():
			if !line.begins_with("#"):
				args.append(line)
	if !AddonList.items.empty():
		args.append("-file")
		for addon in AddonList.get_item_count():
			print(AddonList.get_item_text(addon))
			args.append(AddonList.get_item_text(addon))
	print(ExecLineEdit.text + String(args))
	OS.execute(ExecLineEdit.text, args, false)

func _on_ExitButton_pressed():
	save_data()
	get_tree().quit()

func _notification(what):
	if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
		save_data()
		get_tree().quit()

func _on_ExecDialog_file_selected(path):
	ExecLineEdit.text = path


func _on_ExecBrowseButton_pressed():
	var file = File.new()
	if file.file_exists(ExecLineEdit.text):
		$ExecDialog.current_path = ExecLineEdit.text
	$ExecDialog.popup()


func _on_AddButton_pressed():
	ServerList.add_item(ServerLineEdit.text)


func _on_RemoveButton_pressed():
	if ServerList.is_anything_selected():
		ServerList.remove_item(ServerList.get_selected_items()[0])


func _on_ServerList_item_selected(index):
	ServerLineEdit.text = String(ServerList.items[index*3])


func _on_Button_pressed():
	OS.shell_open(str("file://", OS.get_user_data_dir()))
	pass # Replace with function body.


func _on_DisplaySettings_changed(index):
	$Panel/TabContainer/Settings/DisplayPanel/DisplayHelpLabel.build_label(
		FullscreenOptions.selected,
		RenderOptions.selected
	)


func _on_DownloadButton_pressed():
	$DownloadDialog.show()



func _on_DownloadDialog_finished_everything(location):
	ExecLineEdit.text = location


func _on_HomeCheck_toggled(button_pressed):
	if button_pressed == true:
		$Panel/TabContainer/Settings/OtherPanel/HomeLineEdit.set_editable(true)
		$Panel/TabContainer/Settings/OtherPanel/HomeLineEdit/HomeBrowseButton.set_disabled(false)
	else:
		$Panel/TabContainer/Settings/OtherPanel/HomeLineEdit.set_editable(false)
		$Panel/TabContainer/Settings/OtherPanel/HomeLineEdit/HomeBrowseButton.set_disabled(true)

func _on_HomeBrowseButton_pressed():
	$HomeDialog.popup()

func _on_HomeDialog_dir_selected(dir):
	$Panel/TabContainer/Settings/OtherPanel/HomeLineEdit.set_text(dir)


func _on_AddonAddButton_pressed():
	if OS.get_name() == "X11": # linux's content folder is separate from the executable, so lest search for that.
		# start in ~/.srb2kart or HOME if it doesnt exist
		$AddonDialog.current_path = OS.get_environment("HOME")+"/" 
		$AddonDialog.current_path = OS.get_environment("HOME")+"/.srb2kart/"
		# search home if set
		if CustomParameters.text != "":
			for line in CustomParameters.get_parameters():
				if line.begins_with("-home"):
					$AddonDialog.current_path = line.right(6)+"/.srb2kart/"
	else:
		$AddonDialog.current_path = ExecLineEdit.text
	$AddonDialog.current_file = ""
	$AddonDialog.popup()
	pass # Replace with function body.


func _on_AddonDialog_files_selected(paths):
	for addon in paths:
		print(addon)
		AddonList.add_item(addon)
	pass # Replace with function body.


func _on_AddonRemoveButton_pressed():
	if AddonList.is_anything_selected():
		AddonList.remove_item(AddonList.get_selected_items()[0])


func _on_AddonListDialog_file_selected(path):
	var file = File.new()
	# Store the addon list in a human readable plaintext format. Iterates through the list of
	# addons to do this, rather than solely rely on saving the list variable.
	if $AddonListDialog.mode == $AddonListDialog.MODE_SAVE_FILE:
		file.open(path, File.WRITE)
		print(AddonList.items)
		for addon in AddonList.get_item_count():
			file.store_line(AddonList.get_item_text(addon))
	elif $AddonListDialog.mode == $AddonListDialog.MODE_OPEN_FILE:
		file.open(path, File.READ)
		# Clear the addon list currently present
		AddonList.clear()
		while not file.eof_reached(): # iterate through all lines until the end of file is reached
			AddonList.add_item(file.get_line())


func _on_AddonSaveBtn_pressed():
	$AddonListDialog.current_dir = OS.get_user_data_dir()+"/addonlists"
	$AddonListDialog.mode = $AddonListDialog.MODE_SAVE_FILE
	$AddonListDialog.window_title = "Save Addon List"
	$AddonListDialog.popup()
	pass # Replace with function body.


func _on_AddonLoadBtn_pressed():
	$AddonListDialog.current_dir = OS.get_user_data_dir()+"/addonlists"
	$AddonListDialog.mode = $AddonListDialog.MODE_OPEN_FILE
	$AddonListDialog.window_title = "Load Addon List"
	$AddonListDialog.popup()
	pass # Replace with function body.