class_name DroppedBlock
extends RigidBody3D


const PREFAB: PackedScene = preload("res://scenes/blocks/dropped_block.tscn")

## The amount of time to wait before PickupArea is set to monitorable[br]
##   This is to ensure that the item isn't picked up immediately after throwing
@export var pickup_timeout: int = 1
@export var lifetime_in_seconds: int = 10 ## Lifetime before despawning
@export var animation_player: AnimationPlayer
@export var block_mesh: BlockMesh
@export var lifetime_timer: Timer
@export var pickup_area: Area3D

var id: String
var impulse: Vector3 = Vector3.ZERO


func _ready() -> void:
	lifetime_timer.timeout.connect(_on_lifetime_timeout)

	## AnimationPlayer handles modifying BlockMesh scale, position, and rotation
	##   The scale is NOT applied to any other node, including RigidBody and CollisionShape
	animation_player.play("start_animation")

	## Wait for pickup_timeout to ensure player does not trigger
	##  pickup immediately after throwing
	await get_tree().create_timer(pickup_timeout).timeout
	pickup_area.monitoring = true


# TODO: Rename to something else (maybe remove())
#       Move to signal?
func destroy_block() -> void:
	queue_free()

func get_id() -> String:
	return id

func initialize(block_id: String, start_position: Vector3, drop_direction: Vector3 = Vector3.ZERO, drop_impulse: float = 0.0) -> void:
	set_id(block_id)
	position = start_position
	impulse = drop_direction * drop_impulse
	apply_central_impulse(impulse)

	lifetime_timer.start(lifetime_in_seconds)

func set_id(block_id: String) -> void:
	id = block_id
	if id in DBItems.data:
		block_mesh.apply_material(DBItems.data[id].material_texture)
	else:
		printerr("Unknown Block ID: ", id)


func _on_lifetime_timeout() -> void:
	call_deferred("queue_free")

func _on_pickup_area_body_entered(body: Node3D) -> void:
	if not body is Player: return

	# TODO: Update stack count dynamically
	var stack_count: int = 1
	var item: DBItemResource = (DBItems.data[get_id()] as Resource).duplicate()
	item.amount = stack_count
	InventoryManager.item_picked_up.emit(item)
	queue_free()