class_name TargetFinder extends Node

enum TARGETING_STRATEGY {
	RANDOM = 0,
	MOST_PROGRESSED = 1,
}

@export var tower: Tower
@export var max_targets: int = 1
@export var targeting_strategy: TARGETING_STRATEGY = TARGETING_STRATEGY.MOST_PROGRESSED

#TODO: this was the quantum cache, so uh, maybe thats a godot bug ?
#var multiple_targets_cache: Array[EnemyController]
#var has_target: bool :
	#get:
		#return targets.size() > 0
	#set(_value):
		#return
#
#var targets: Array[EnemyController] :
	#get:
		#return get_multiple_targets()
	#set(_value):
		#return
#
#
#func get_multiple_targets() -> Array[EnemyController]:
	#var new_cache: Array[EnemyController] = []
	#for enemy: EnemyController in multiple_targets_cache:
		#if is_instance_valid(enemy) and enemy.alive and enemy.global_position.distance_to(tower.global_position) <= tower.target_range:
			#new_cache.append(enemy)
	#if max_targets == 0 or new_cache.size() < max_targets:
		#multiple_targets_cache = find_multiple_targets(new_cache)
	#return multiple_targets_cache

var targets: Array[EnemyController] :
	get:
		return find_multiple_targets()
	set(_value):
		return


#func find_multiple_targets(existing_cache: Array[EnemyController]) -> Array[EnemyController]:
func find_multiple_targets() -> Array[EnemyController]:
	var possible_enemies: Array[EnemyController] = []
	for enemy: EnemyController in get_tree().get_nodes_in_group("Enemies"):
		if !is_instance_valid(enemy):
			continue
		if tower.global_position.distance_to(enemy.global_position) > tower.target_range:
			continue
		if !(enemy.stats.target_type & tower.stats.target_type):
			continue
		#if multiple_targets_cache.has(enemy):
		#	continue
		possible_enemies.append(enemy)
	
	#var enemies_to_select: int = max_targets - existing_cache.size()
	var enemies: Array[EnemyController] = [] # temp cache, see above todo
	var enemies_to_select: int = max_targets
	if max_targets == 0:
		enemies_to_select = possible_enemies.size()
	for x: int in enemies_to_select:
		if possible_enemies.size() == 0:
			break
		var chosen: EnemyController = null
		match targeting_strategy:
			TARGETING_STRATEGY.RANDOM:
				chosen = select_random(possible_enemies)
			TARGETING_STRATEGY.MOST_PROGRESSED:
				chosen = select_most_progressed(possible_enemies)
		possible_enemies.erase(chosen)
		#existing_cache.append(chosen)
		enemies.append(chosen)
	
	#return existing_cache
	return enemies


func select_random(choices: Array[EnemyController]) -> EnemyController:
	return choices.pick_random()


func select_most_progressed(choices: Array[EnemyController]) -> EnemyController:
	var most_progressed_enemy: EnemyController = null
	for enemy: EnemyController in choices:
		var em_1: EnemyMovement = enemy.movement_controller as EnemyMovement
		var em_2: EnemyMovement = null
		if most_progressed_enemy != null:
			em_2 = most_progressed_enemy.movement_controller as EnemyMovement
		if (most_progressed_enemy == null or em_1.distance_remaining < em_2.distance_remaining):
			most_progressed_enemy = enemy
	return most_progressed_enemy