class_name BalleElectrique
extends Balle
# Balle electrique qui fait des degats a distance quand chargee


signal charge
signal decharge

const BalleElectriqueScene: PackedScene = preload("res://composants/objets/balle/balle_elec/balle_electrique.tscn")
const duree_clignotement_max: float = 0.05 # sec

var _duree_clignotement: float = 0.0
var surchargee: bool = true # vrai si l'electricite deborde

@onready var image: Sprite2D = $ImageSurcharge


func _process(delta: float) -> void:
	_clignoter(delta)


func electrise(brique: Brique) -> void:
	assert(surchargee, "Ne peut pas electriser si non chargee")
	brique.frapper(1)
	surchargee = false
	decharge.emit()


func recharge() -> void:
	surchargee = true
	charge.emit()


## La balle electrique se recharge au contact de la raquette
func _mettre_en_mouvement(dir: Vector2) -> void:
	super._mettre_en_mouvement(dir)
	recharge()


func _clignoter(delta: float) -> void:
	if not surchargee:
		return

	_duree_clignotement += delta

	if _duree_clignotement < duree_clignotement_max:
		# trop tot pour clignoter
		return

	# pas de 0, donc au moins un axe est flip
	var axes_a_inverser: int = randi_range(1, 3)
	var inversion_horizontale: bool = axes_a_inverser % 2 == 1
	var inversion_verticale: bool = axes_a_inverser / 2 == 1

	if inversion_verticale:
		image.flip_v = not image.flip_v
	if inversion_horizontale:
		image.flip_h = not image.flip_h

	image.set_rotation(randf_range(0.0, 2 * PI))

	_duree_clignotement = 0.0


## Transforme une balle quelconque en balle electrique
static func transformer(balle: Balle) -> void:
	var balle_elec: BalleElectrique = BalleElectriqueScene.instantiate()
	balle.add_sibling.call_deferred(balle_elec) # Appeler plus tard sinon Godot pas content
	balle_elec.recopier(balle)
	balle.queue_free()


func _quand_champ_electrique_detecte_coprs(body: Node2D) -> void:
	if surchargee and body is Brique:
		electrise(body)
