@icon("res://assets/editor/64x64/fc681.png")
extends Node2D
class_name StatsComponent

var base_stats: Dictionary[String, Variant] = {
	"base": {
		"health": 100,
		"max_health": 100,
		"armor": 0,
		"max_armor": 0,
		"energy": 100,
		"max_energy": 100,
		"speed": 200.0,
	},
	"melee": {
		"damage": 10,
		"attack_rate": 1,
		"element": Global.ELEMENTS.NONE,
	},
	"ranged": {
		"damage": 10,
		"attack_rate": 1,
		"element": Global.ELEMENTS.NONE,
		"projectile_speed": 500.0,
		"projectile_size": 1.0,
		"projectile_lifetime": 1.0,
		"projectile_quantity": 1,
		"projectile_explode_quantity": 0,
		"projectile_explode_damage": 0.5,
		"pierce_count": 0
	}
}

var stats: Dictionary = {}

func _init() -> void:
	if not stats:
		reset_stats()

func reset_stats() -> void:
	stats = base_stats.duplicate(true)
	Log.pr("StatsComponent reset to base stats")

func get_stat(stat_name: String) -> Variant:
	var stat = get_nested_stat(stat_name)
	if stat:
		return stat
	else:
		Log.pr("Stat not found: ", stat_name)
		return null

func update_stat(stat_name: String, value: Variant) -> void:
	var updating_stat = get_nested_stat(stat_name)
	if updating_stat:
		set_nested_stat(stat_name, value)
		Log.pr("Updated stat: ", stat_name, " to ", value)
	else:
		Log.pr("Stat not found: ", stat_name)

func get_nested_stat(path: String) -> Variant:
	var keys = path.split(".")
	var current = stats

	for key in keys:
		if current is Dictionary and current.has(key):
				current = current[key]
		else:
				return null # Path doesn't exist

	return current

func set_nested_stat(path: String, value) -> bool:
	var keys = path.split(".")
	var current = stats

	# Navigate to the parent of the final key
	for i in range(keys.size() - 1):
			var key = keys[i]
			
			# Check if key exists and is a dictionary
			if not current.has(key) or not current[key] is Dictionary:
					Log.error("Invalid stat path: " + path + " (key '" + key + "' doesn't exist or isn't a dictionary)")
					return false
					
			current = current[key]

	# Check if final key exists
	var final_key = keys[keys.size() - 1]
	if not current.has(final_key):
			Log.error("Invalid stat path: " + path + " (key '" + final_key + "' doesn't exist)")
			return false

	# Set the value at the final key
	current[final_key] = value
	return true
