extends Control

## 메인 HUD UI 제어 스크립트 (HUD)
## 플레이어 자원 현황, 게임 결과 팝업, 유닛 소환 메커니즘을 총괄합니다.

# 유닛 씬 및 데이터 프리로드
@export var base_unit_scene: PackedScene = preload("res://src/entities/units/base_unit.tscn")

# UI 노드 자동 캐싱
@onready var gold_label: Label = $TopBar/GoldLabel
@onready var stage_label: Label = $TopBar/StageLabel
@onready var monster_label: Label = $TopBar/MonsterLabel
@onready var spawn_button: Button = $BottomBar/SpawnButton
@onready var result_popup: Panel = $ResultPopup
@onready var result_title: Label = $ResultPopup/ResultTitle
@onready var restart_button: Button = $ResultPopup/RestartButton

# 5가지 유닛 능력치 리소스 템플릿 배열
var _unit_templates: Array[UnitData] = []

func _ready() -> void:
	# 5종 유닛 리소스 템플릿 빌드
	_initialize_unit_templates()
	
	# GameManager 시그널 핸들러 등록
	GameManager.gold_changed.connect(_on_gold_changed)
	GameManager.stage_changed.connect(_on_stage_changed)
	GameManager.active_monster_count_changed.connect(_on_monster_changed)
	GameManager.game_lost.connect(_on_game_lost)
	GameManager.game_victory.connect(_on_game_victory)
	
	# UI 버튼 바인딩
	spawn_button.pressed.connect(_on_spawn_pressed)
	restart_button.pressed.connect(_on_restart_pressed)
	
	# 초기 화면 레이아웃 설정
	result_popup.visible = false
	_on_gold_changed(GameManager.player_gold)
	_on_stage_changed(GameManager.current_stage)
	_on_monster_changed(GameManager.active_monster_count)

## 5종의 유닛 능력치 데이터 초기 셋업
func _initialize_unit_templates() -> void:
	# 1. Striker (연사형 근접 유닛)
	var striker: UnitData = UnitData.new()
	striker.unit_id = "Unit_Striker"
	striker.unit_name = "Striker"
	striker.damage = 12.0
	striker.cooldown = 0.5
	striker.move_speed = 6.0
	striker.attack_range = 1.5
	striker.is_ranged = false
	striker.unit_color = Color(0.12, 0.45, 0.85, 1.0) # 청색
	_unit_templates.append(striker)
	
	# 2. Guardian (밸런스형 근접 유닛)
	var guardian: UnitData = UnitData.new()
	guardian.unit_id = "Unit_Striker"
	guardian.unit_name = "Guardian"
	guardian.damage = 25.0
	guardian.cooldown = 1.0
	guardian.move_speed = 4.0
	guardian.attack_range = 1.5
	guardian.is_ranged = false
	guardian.unit_color = Color(0.85, 0.65, 0.12, 1.0) # 황금색
	_unit_templates.append(guardian)
	
	# 3. Ranger (원거리 유닛)
	var ranger: UnitData = UnitData.new()
	ranger.unit_id = "Unit_Striker"
	ranger.unit_name = "Ranger"
	ranger.damage = 18.0
	ranger.cooldown = 0.8
	ranger.move_speed = 4.5
	ranger.attack_range = 10.0
	ranger.is_ranged = true
	ranger.unit_color = Color(0.12, 0.75, 0.25, 1.0) # 녹색
	_unit_templates.append(ranger)
	
	# 4. Slayer (고화력 대형 유닛)
	var slayer: UnitData = UnitData.new()
	slayer.unit_id = "Unit_Striker"
	slayer.unit_name = "Slayer"
	slayer.damage = 55.0
	slayer.cooldown = 1.8
	slayer.move_speed = 3.5
	slayer.attack_range = 1.6
	slayer.is_ranged = false
	slayer.unit_color = Color(0.85, 0.12, 0.12, 1.0) # 진적색
	_unit_templates.append(slayer)
	
	# 5. Archmage (극단적 극딜 마법 유닛)
	var archmage: UnitData = UnitData.new()
	archmage.unit_id = "Unit_Striker"
	archmage.unit_name = "Archmage"
	archmage.damage = 110.0
	archmage.cooldown = 3.0
	archmage.move_speed = 3.0
	archmage.attack_range = 12.0
	archmage.is_ranged = true
	archmage.unit_color = Color(0.55, 0.12, 0.85, 1.0) # 보라색
	_unit_templates.append(archmage)

# 골드 UI 갱신 및 소환 한도 검증
func _on_gold_changed(gold: int) -> void:
	gold_label.text = "GOLD: " + str(gold) + " G"
	# 골드가 부족하면 유닛 소환 버튼 비활성화
	spawn_button.disabled = (gold < GameManager.unit_spawn_cost)

# 스테이지 UI 갱신
func _on_stage_changed(stage: int) -> void:
	stage_label.text = "STAGE: " + str(stage) + " / " + str(GameManager.MAX_STAGE)

# 필드 몬스터 개수 UI 갱신
func _on_monster_changed(count: int) -> void:
	monster_label.text = "MONSTERS: " + str(count) + " / " + str(GameManager.DEFEAT_MONSTER_LIMIT)

# 게임 오버 시 팝업 현시
func _on_game_lost() -> void:
	result_title.text = "GAME OVER\nMonster Limit Exceeded!"
	result_popup.visible = true

# 게임 승리 시 팝업 현시
func _on_game_victory() -> void:
	result_title.text = "VICTORY!\nYou Survived All Stages!"
	result_popup.visible = true

# 유닛 무작위 소환 수행
func _on_spawn_pressed() -> void:
	if GameManager.is_game_over:
		return
		
	# 골드 비용 소모 시도
	if GameManager.spend_gold(GameManager.unit_spawn_cost):
		# 20% 동일 확률로 5종 유닛 중 무작위 1개 선정
		var random_index: int = randi() % _unit_templates.size()
		var chosen_template: UnitData = _unit_templates[random_index]
		
		# 유닛 객체 스폰 (Striker 전용 씬 분기 분할)
		var target_scene: PackedScene = base_unit_scene
		if chosen_template.unit_id == "Unit_Striker":
			var striker_scene: PackedScene = load("res://src/entities/units/striker/striker_unit.tscn") as PackedScene
			if striker_scene:
				target_scene = striker_scene
				
		var new_unit: Node = target_scene.instantiate()
		var parent_scene: Node = get_tree().current_scene
		
		# 맵 중앙 스폰 존(0, 0) 기준 분산 스폰 좌표 지정
		var spawn_offset: Vector3 = Vector3(
			randf_range(-2.0, 2.0),
			0.1,
			randf_range(-2.0, 2.0)
		)
		
		# 스폰 위치 설정 및 능력치 주입
		if new_unit is Node3D:
			(new_unit as Node3D).global_position = spawn_offset
			
		new_unit.set("unit_data", chosen_template)
		parent_scene.add_child(new_unit)
		
		print("Spawned random unit: ", chosen_template.unit_name, " at position ", spawn_offset)

# 게임 재시작 기능
func _on_restart_pressed() -> void:
	# 필드 위 모든 유닛 제거
	var units: Array[Node] = get_tree().get_nodes_in_group("units")
	for unit: Node in units:
		if is_instance_valid(unit):
			unit.queue_free()
			
	# 필드 위 모든 몬스터 제거
	var monsters: Array[Node] = get_tree().get_nodes_in_group("monsters")
	for monster: Node in monsters:
		if is_instance_valid(monster):
			monster.queue_free()
			
	# GameManager 상태 초기화
	GameManager.reset_game()
	result_popup.visible = false
	
	# 스테이지 재베이킹 및 스폰 리셋을 위해 씬 리로드 우회 처리 가능하나
	# 여기서는 간단히 GameManager reset 이후 StageManager가 몬스터를 처음부터 다시 배치하도록 대응
	var stage_mgr: Node = get_node_or_null("../StageManager")
	if stage_mgr:
		stage_mgr.call("_ready")
