extends Node
class_name Logger

var thread: Thread = Thread.new()
var mutex: Mutex = Mutex.new()
var log_queue: Array[String] = []
var running: bool = true


func _ready():
	thread.start(log_writer)


func info(msg: Variant):
	mutex.lock()
	log_queue.append("[color=white][b]INFO:[/b] [/color]" + msg)
	mutex.unlock()


func debug(msg: Variant):
	mutex.lock()
	log_queue.append("[color=cyan][b]DEBUG:[/b] [/color]" + msg)
	mutex.unlock()


func warning(msg: Variant):
	mutex.lock()
	log_queue.append("[color=yellow][b]WARN:[/b] [/color]" + msg)
	push_warning(msg)
	mutex.unlock()


func error(msg: Variant):
	mutex.lock()
	log_queue.append("[color=red][b]ERROR:[/b] [/color]" + msg)
	push_error(msg)
	mutex.unlock()


func log_writer():
	while running:
		mutex.lock()
		while log_queue.size() > 0:
			var log_message = log_queue.pop_front()
			print_rich(log_message)
		mutex.unlock()

		# Prevent high CPU usage
		await get_tree().create_timer(0.1).timeout


func _exit_tree():
	running = false
	thread.wait_to_finish()