class_name DeathComponent
extends CharacterComponent

@export var health: HealthComponent
@export var hud: HUDComponent
@export var animation: AnimationPlayer
@export var drop: PackedScene
@export var respawn_time: float = 5.0

var respawn_position: Vector3

func _ready():
	respawn_position = character.global_position
	health.death.connect(on_death)

func on_death():
	drop_loot()
	die()
	await get_tree().create_timer(respawn_time).timeout
	revive()

func drop_loot():
	var loot := drop.instantiate() as Node3D
	character.get_parent().add_child(loot)
	loot.global_position = character.global_position + loot.position

func die():
	DeathComponent.set_physics(character, false)
	hud.visible = false
	animation.play("slime_death")

func revive():
	health.restore()
	DeathComponent.set_physics(character, true)
	hud.visible = true
	character.transform = Transform3D.IDENTITY
	character.global_position = respawn_position
	animation.play("slime_idle")

static func set_physics(obj: Node3D, alive: bool):
	obj.propagate_call("set_process", [alive])
	obj.propagate_call("set_physics_process", [alive])
	obj.get_node("Collision").call_deferred("set_disabled", !alive)