class_name ClassFunctions extends Control

# This should be looked at again when GoDot 4.3 ships as has new OS.execute_with_pipe

func array_to_string(arr: Array) -> String:
	var text: String
	for line in arr:
		#text += line + "\n"
		text = line.strip_edges() + "\n"
	return text

func execute_command(command: String, parameters: Array, console: bool) -> Dictionary:
	var result = {}
	var output = []
	var exit_code = OS.execute(command, parameters, output, console) ## add if exit == 0 etc
	result["output"] = array_to_string(output)
	result["exit_code"] = exit_code
	#print (array_to_string(output))
	#print (result["exit_code"])
	return result

func run_command_in_thread(command: String, paramaters: Array, _console: bool) -> Dictionary:
	var thread = Thread.new()
	thread.start(execute_command.bind(command,paramaters,false))
	while thread.is_alive():
		await get_tree().process_frame
	var result = thread.wait_to_finish()
	thread = null
	return result

func _threaded_command_execution(command: String, parameters: Array, console: bool) -> Dictionary:
	var result = execute_command(command, parameters, console)
	return result

# Make this generic for command, path and naming
func get_text_file_from_system_path(file_path: String, command: String, etype: String) -> Dictionary:
	var output: Array
	var data_dict: Dictionary
	command += file_path
	var exit_code = OS.execute("sh", ["-c", command], output)
	if exit_code == 0:
		var content = array_to_string(output)
		if etype == "emulist":
			data_dict = parse_file_list(content)
		elif etype == "normal":
			data_dict = parse_imported_string(content)
		else:
			print ("Error in get text function")
		return data_dict
	else:
		print("Error reading file: ", exit_code)
		return {}
		
func parse_imported_string(input_string: String) -> Dictionary:
	var _result: Dictionary
	var _current_dict_key: String
	var lines = input_string.strip_edges().split("\n", false)
	#if lines.size() > 0:
	#	lines = lines.slice(1, lines.size())  # Skip the first line
	for line in lines:
		_current_dict_key = line
		var parts = line.split("=", false)
		if parts.size() == 2:
			var key = parts[0]
			var value_str = parts[1]
			_result[key] = {"KEY": key, "Value": value_str}
	return _result
	
func parse_file_list(content: String) -> Dictionary:
	var file_dict = {}
	var regex = RegEx.new()
	regex.compile(r'"([^"]+)"\s*"([^"]+)"')
	var matches = regex.search_all(content)
	
	for match in matches:
		var name = match.get_string(1)
		var description = match.get_string(2)
		file_dict[name] = description
	return file_dict

func process_url_image(body) -> Texture:
	var image = Image.new()
	image.load_png_from_buffer(body)
	var texture = ImageTexture.create_from_image(image)
	return texture

func launch_help(url: String) -> void:
	OS.shell_open(url)

func import_csv_data(file_path: String) -> Dictionary:
	# check if file exists
	var data_dict: Dictionary
	var file = FileAccess.open(file_path,FileAccess.READ)
	if file:
		var csv_lines: PackedStringArray = file.get_as_text().strip_edges().split("\n")
		for i in range(1, csv_lines.size()):  # Start from 1 to skip the header
			var line = csv_lines[i]
			var columns = line.split(",")
			if columns.size() >= 3: 
				var id = columns[0]
				var url = columns[1]
				var description = columns[2]
				data_dict[id] = {"URL": url, "Description": description}
		file.close()
	else:
		print ("Could not open file: %s", file_path)

	return data_dict

func _import_data_lists(file_path: String) -> void:
	var tk_about: Dictionary = import_csv_data(file_path)
	
	for key in tk_about.keys():
		var entry = tk_about[key]
		print("ID: " + key)
		print("URL: " + entry["URL"])
		print("Description: " + entry["Description"])
		print("---")


func get_about_links_from_file(file_path: String) -> Dictionary:
	var about_links_dict = {}
	var file = FileAccess.open(file_path, FileAccess.READ)

	if file:
		var json_string = file.get_as_text()
		file.close()
		
		var json = JSON.new()
		var parse_result = json.parse(json_string)
		print ("RES: %s",parse_result)

		if parse_result == OK:
			var data = parse_result
			print (data)
			print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
			#continue
			if parse_result is Dictionary:
				if parse_result.has("about_links"):
					var about_links = parse_result["about_links"]
					about_links_dict = parse_about_links(about_links)
				else:
					print("Error: 'about_links' key not found in JSON.")
		else:
			print("Error parsing JSON: %s" % json.error_string)
	else:
		print("Failed to open file: %s" % file_path)

	print (about_links_dict)
	return about_links_dict

func parse_about_links(about_links: Array) -> Dictionary:
	var about_links_dict = {}

	for link in about_links:
		about_links_dict[link["id"]] = {
			"name": link["name"],
			"url": link["url"],
			"description": link["description"]
		}
	
	return about_links_dict