extends Node2D

export var avoider_template: PackedScene
export var inner_color := Color()
export var outer_color := Color()
export var agent_count := 60

var boundaries: Vector2


func _ready() -> void:
	boundaries = Vector2(
		ProjectSettings["display/window/size/width"], ProjectSettings["display/window/size/height"]
	)
	var rng := RandomNumberGenerator.new()
	var avoiders := []
	var avoider_agents := []
	for i in range(agent_count):
		var avoider := avoider_template.instance()
		add_child(avoider)
		avoider.setup(
			owner.linear_speed_max,
			owner.linear_acceleration_max,
			owner.proximity_radius,
			boundaries.x,
			boundaries.y,
			true if i == 0 and owner.draw_proximity else false,
			rng
		)
		avoider_agents.append(avoider.agent)
		avoider.set_random_nonoverlapping_position(avoiders, 16)
		if i == 0:
			avoider.collision.inner_color = inner_color
			avoider.collision.outer_color = outer_color
		avoiders.append(avoider)
		if i % 10 == 0:
			yield(get_tree(), "idle_frame")
	for child in get_children():
		child.set_proximity_agents(avoider_agents)


func _physics_process(_delta: float) -> void:
	for child in get_children():
		child.global_position = child.global_position.posmodv(boundaries)


func set_linear_speed_max(value: float) -> void:
	for child in get_children():
		child.agent.linear_speed_max = value


func set_linear_accel_max(value: float) -> void:
	for child in get_children():
		child.agent.linear_acceleration_max = value


func set_proximity_radius(value: float) -> void:
	for child in get_children():
		child.proximity.radius = value
	get_child(0).update()


func set_draw_proximity(value: bool) -> void:
	var child := get_child(0)
	child.draw_proximity = value
	child.update()
