extends Node
# ModifierCatalog.gd
# Holds the master list of every modifier in the game and picks random sets
# for each round. Register this as an AUTOLOAD (Project > Project Settings >
# Autoload) with the name "ModifierCatalog" so any script can reach it globally.
#
# Two ways to fill the catalog:
#  A) Drop .tres Modifier files into res://Modifiers/ and they auto-load (below).
#  B) Build them in code in _register_builtins() for quick prototyping.

var modifiers: Array[Modifier] = []
var _by_id: Dictionary = {}        # id -> Modifier, for fast lookup

func _ready() -> void:
	_load_from_folder("res://Modifiers/")
	if modifiers.is_empty():
		# Fallback so the prototype works before you author .tres files.
		_register_builtins()
	_reindex()
	print("ModifierCatalog loaded ", modifiers.size(), " modifiers.")

# Load every .tres Modifier resource from a folder.
func _load_from_folder(path: String) -> void:
	var dir := DirAccess.open(path)
	if dir == null:
		return
	dir.list_dir_begin()
	var fname := dir.get_next()
	while fname != "":
		if not dir.current_is_dir() and fname.ends_with(".tres"):
			var res := load(path + fname)
			if res is Modifier:
				modifiers.append(res)
		fname = dir.get_next()
	dir.list_dir_end()

# Quick code-defined modifiers for prototyping. Replace texture paths with yours.
func _register_builtins() -> void:
	modifiers.append(_make("stars_x5", "Stars", "Multiplies this segment's value by 5.",
		"res://Models/Dartboard/Dartboard-Proto_Red.png", 5.0, 0))
	modifiers.append(_make("double", "Double", "Doubles this segment's value.",
		"res://Models/Dartboard/Dartboard-Proto_Green.png", 2.0, 0))
	modifiers.append(_make("plus10", "Bonus +10", "Adds 10 points to this segment.",
		"res://Models/Dartboard/Dartboard-Proto_Cork.png", 1.0, 10))

func _make(id: String, title: String, desc: String, tex_path: String,
		mult: float, add: int) -> Modifier:
	var m := Modifier.new()
	m.id = id
	m.title = title
	m.description = desc
	m.texture = load(tex_path)
	m.score_mult = mult
	m.score_add = add
	return m

func _reindex() -> void:
	_by_id.clear()
	for m in modifiers:
		_by_id[m.id] = m

func get_by_id(id: String) -> Modifier:
	return _by_id.get(id)

# Pick `count` distinct random modifiers, respecting weight. Returns an Array.
func pick_random(count: int) -> Array[Modifier]:
	var pool := modifiers.duplicate()
	var chosen: Array[Modifier] = []
	count = min(count, pool.size())
	for _i in count:
		var total := 0.0
		for m in pool:
			total += max(m.weight, 0.0001)
		var r := randf() * total
		var acc := 0.0
		var picked_index := 0
		for j in pool.size():
			acc += max(pool[j].weight, 0.0001)
			if r <= acc:
				picked_index = j
				break
		chosen.append(pool[picked_index])
		pool.remove_at(picked_index)   # distinct: don't pick the same one twice
	return chosen
