extends Node2D

signal get_firing
signal is_full

enum State {
	READY,
	FIRING,
	WAITING,
}

export var BULLET_SPEED = 500.0

var _ballScene = preload("res://scenes/Ball.tscn")

var nbAmmo = 0
var nbStorage = 1

onready var target = $Target
onready var source = $Source
onready var shootDelay = $ShootDelay
onready var grid = $Grid

onready var current_state = State.WAITING


func _ready():
	get_ready()


func _input(event):
	if event is InputEventMouseButton and event.is_pressed() :
		trigger(event.position)


func trigger(aim:Vector2):
	if (current_state == State.READY):
		current_state = State.FIRING
		target.position = aim
		emit_signal("get_firing")


func shoot():
		var bullet = _ballScene.instance()
		bullet.position = source.position
		bullet.linear_velocity = (target.position - source.position).normalized()
		bullet.linear_velocity *= BULLET_SPEED
		add_child(bullet)
		bullet.connect("tree_exited", self, "_on_Ball_tree_exited")
		bullet.connect("kace_contact", grid, "_on_Ball_kace_contact")


func load_bullet(n:int):
	nbStorage += n


func get_ready():
	current_state = State.READY
	target.position = source.position
	nbAmmo = nbStorage
	nbStorage = 0


func _on_ShootDelay_timeout():
	shoot()
	nbAmmo -= 1
	if (nbAmmo == 0):
		current_state = State.WAITING
	else:
		emit_signal("get_firing")


func _on_Launcher_get_firing():
	shootDelay.start()


func _on_Ball_tree_exited():
	load_bullet(1)
	if (get_tree().get_nodes_in_group("ball").size() == 0):
		emit_signal("is_full")


func _on_Grid_has_moved():
	get_ready()


func _on_Grid_kace_broken():
	load_bullet(1)