@tool
@icon("res://composants/objets/brique/IconeBrique.svg")
class_name Brique
extends StaticBody2D


signal eclatee

const EclatementScene: PackedScene = preload("res://effets/eclatement_brique/eclatement_effet.tscn")
const CapsuleScene: PackedScene = preload("res://composants/objets/capsule/capsule.tscn")
const NOMBRE_DE_VIES_MAX: int = 4

## Le nombre de coups necessaires pour detruire la brique.
@export_range(1, NOMBRE_DE_VIES_MAX) var nombre_de_vies: int = 1:
	set = set_nombre_de_vies
@export var pouvoir_type: Pouvoir.Type = Pouvoir.Type.AUCUN:
	set = set_pouvoir_type

var _texture_brique: Texture2D = preload("res://composants/objets/brique/images/01.png")

@onready var image: Sprite2D = $Image


func _ready() -> void:
	_montrer_nombre_vies()
	_montrer_type_pouvoir()


func frapper(nb_degats: int) -> void:
	nombre_de_vies -= nb_degats
	if nombre_de_vies <= 0:
		_mourir()


func _montrer_nombre_vies() -> void:
	var nouvelle_couleur: Color = Color.WHITE * (NOMBRE_DE_VIES_MAX - nombre_de_vies) / (NOMBRE_DE_VIES_MAX - 1)
	nouvelle_couleur.a = 1.0 # rendre opaque
	set_modulate(nouvelle_couleur)


func _montrer_type_pouvoir() -> void:
	if not is_node_ready():
		return

	image.set_texture(_texture_brique)


func _associe_texture_brique(nouveau_type_pouvoir: Pouvoir.Type) -> void:
	match nouveau_type_pouvoir:
		Pouvoir.Type.AUCUN:
			_texture_brique = preload("res://composants/objets/brique/images/01.png")
		Pouvoir.Type.FEU:
			_texture_brique = preload("res://composants/objets/brique/images/43.png")
		Pouvoir.Type.VIE:
			_texture_brique = preload("res://composants/objets/brique/images/44.png")
		Pouvoir.Type.RALENTIR:
			_texture_brique = preload("res://composants/objets/brique/images/08.png")
		Pouvoir.Type.JAVELOT:
			_texture_brique = preload("res://composants/objets/brique/images/46.png")
		Pouvoir.Type.ELECTRIQUE:
			_texture_brique = preload("res://composants/objets/brique/images/12.png")
		_:
			_texture_brique = preload("res://composants/objets/brique/images/34.png")
	_montrer_type_pouvoir()


func _mourir() -> void:
	queue_free()
	_eclater()
	_liberer_capsule()


func _eclater() -> void:
	var effet_eclatement: Node2D = EclatementScene.instantiate()
	effet_eclatement.position = self.position
	add_sibling(effet_eclatement)

	eclatee.emit()


func _liberer_capsule() -> void:
	if Pouvoir.Type.AUCUN == pouvoir_type:
		return # pas de pouvoir a liberer

	var capsule: Node2D = CapsuleScene.instantiate()
	capsule.position = self.position
	capsule.pouvoir = Pouvoir.fabriquer(pouvoir_type)
	add_sibling.call_deferred(capsule)


func set_nombre_de_vies(nb: int) -> void:
	nombre_de_vies = nb
	_montrer_nombre_vies()


func set_pouvoir_type(nouveau_type: Pouvoir.Type) -> void:
	pouvoir_type = nouveau_type
	_associe_texture_brique(nouveau_type)