extends Control

var mime_types := MimeTypeHelper.generate_db()

var _server: HTTPServer = null

onready var server_ui := $ServerUI
onready var server_dir = server_ui.server_dir


func _ready() -> void:
	pass


func _start_server(port: int = 3001) -> void:
	if _server:
		return

	_server = HTTPServer.new()
	var dir := Directory.new()
	if dir.open(server_dir) == OK:
		if dir.list_dir_begin() != OK:
			# TODO: show error to user here
			return
		var file_name := dir.get_next()
		while file_name != "":
			if !dir.current_is_dir():
				if file_name.get_extension() == "import":
					file_name = dir.get_next()
					continue

#				print(file_name)

				_server.endpoint(HTTPServer.Method.GET, "/%s" % file_name, funcref(self, "_serve_file"), [file_name])

			file_name = dir.get_next()

		_server.endpoint(HTTPServer.Method.GET, "/", funcref(self, "_serve_file"), ["index.html"])


	if _server.listen(port) != OK:
		# TODO: show error to user here
		return

	server_ui.is_server_running = true


func _stop_server() -> void:
	if _server:
		_server.stop()
		_server = null

		server_ui.is_server_running = false


func _process(_delta: float) -> void:
	if _server == null:
		return

	if not _server.take_connection():
		# TODO: show error to user here
		return


func _serve_file(_request: HTTPServer.Request, response: HTTPServer.Response, binds: Array) -> void:
	var file_name: String = binds[0] as String

	var f := File.new()
	var success = f.open("res://server_files/%s" % file_name, File.READ)

	if success == OK:
		var mime := mime_types.get(file_name)
		response.type(mime)

		var data = f.get_buffer(f.get_len())

		response.data(data)

	else:
		response.header("content-type", "text/plain")
		response.data("500 - Read Error")


func _on_ServerUI_start_server_button_pressed(port: int, new_dir: String) -> void:
	server_dir = new_dir
	_start_server(port)


func _on_ServerUI_stop_server_button_pressed() -> void:
	_stop_server()
