extends Area2D

## Una singola pallina nella sua corsia. Partendo da destra, se lanciata
## scivola verso il bordo sinistro e poi torna alla posizione di partenza.
## Il rilevamento del tocco/click è gestito centralmente da main.gd tramite
## distanza: qui NON ci sono handler di input dedicati.

signal returned  # emesso quando la pallina torna a casa


var color_name := ""
var ball_color := Color.WHITE
var radius := 40.0
var home_pos := Vector2.ZERO
var left_pos := Vector2.ZERO
var in_motion := false
var _tween: Tween


func _draw() -> void:
	# ombra
	draw_circle(Vector2(0, 5), radius, Color(0, 0, 0, 0.3))
	# corpo
	draw_circle(Vector2.ZERO, radius, ball_color)
	# bordo
	draw_arc(Vector2.ZERO, radius, 0.0, TAU, 48, Color(0, 0, 0, 0.45), 3.0)
	# riflesso
	draw_circle(Vector2(-radius * 0.28, -radius * 0.32), radius * 0.18, Color(1, 1, 1, 0.55))


func setup(cn: String, c: Color, home: Vector2, left: Vector2, r: float) -> void:
	color_name = cn
	ball_color = c
	radius = r
	home_pos = home
	left_pos = left
	position = home
	var shape := CollisionShape2D.new()
	var cs := CircleShape2D.new()
	cs.radius = r * 1.35  # area di tocco ampliata (ma l'input è via distanza in main)
	shape.shape = cs
	add_child(shape)
	queue_redraw()


func is_home() -> bool:
	return not in_motion


func reset() -> void:
	if _tween and _tween.is_valid():
		_tween.kill()
	in_motion = false
	position = home_pos


## Lancia la pallina verso sinistra e la fa tornare a casa. `mt` è il tempo
## totale (andata + ritorno) in secondi.
func launch(mt: float) -> void:
	in_motion = true
	if _tween and _tween.is_valid():
		_tween.kill()
	var half := maxf(mt * 0.5, 0.01)
	_tween = create_tween()
	_tween.tween_property(self, "position", left_pos, half) \
		.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN_OUT)
	_tween.tween_property(self, "position", home_pos, half) \
		.set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN_OUT)
	_tween.finished.connect(_on_motion_done)


func _on_motion_done() -> void:
	in_motion = false
	returned.emit()
