class_name Projectile
extends Node3D

## 원거리 유닛이 발사하는 3D 발사체 개체
## 지정된 대상을 향해 날아가며, 충돌 시 데미지를 가하고 소멸합니다.

var speed: float = 24.0
var damage: float = 0.0
var target: Node3D = null
var color: Color = Color(1.0, 0.9, 0.2, 1.0) # 기본 노란색 발사체

func _ready() -> void:
	# 동적 비주얼 메쉬 생성 (구체 형태의 길쭉한 빛 구슬 표현)
	var mesh_instance: MeshInstance3D = MeshInstance3D.new()
	var sphere_mesh: SphereMesh = SphereMesh.new()
	sphere_mesh.radius = 0.15
	sphere_mesh.height = 0.4
	
	var mat: StandardMaterial3D = StandardMaterial3D.new()
	mat.albedo_color = color
	mat.emission_enabled = true
	mat.emission = color
	mat.emission_energy_multiplier = 3.0
	sphere_mesh.material = mat
	
	mesh_instance.mesh = sphere_mesh
	add_child(mesh_instance)

func _physics_process(delta: float) -> void:
	if GameManager.is_game_over:
		queue_free()
		return
		
	# 타겟이 도중에 사라지거나 사망 시 소멸
	if not is_instance_valid(target) or target.get("is_dead") == true:
		queue_free()
		return
		
	# 타겟 높이 오프셋 보정 (몬스터 중심부 y ~= 0.5를 향하도록)
	var target_center: Vector3 = target.global_position
	if target.has_node("VisualMesh"):
		var vm: Node3D = target.get_node("VisualMesh") as Node3D
		target_center.y = vm.global_position.y
		
	# 방향 계산 및 이동
	var dir: Vector3 = (target_center - global_position).normalized()
	global_position += dir * speed * delta
	
	# 비행 방향 바라보기
	if global_position.distance_to(target_center) > 0.1:
		look_at(target_center, Vector3.UP)
		
	# 타겟 근접 도달 판정 (0.6m 이내)
	if global_position.distance_to(target_center) < 0.6:
		_impact()

## 적에게 충돌하여 데미지 가함
func _impact() -> void:
	if is_instance_valid(target) and target.has_method("take_damage"):
		target.call("take_damage", damage)
		
	# 충돌 이펙트 (필요 시 연출)
	queue_free()
