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

# 몬스터 일시정지 버튼 런타임 저장 변수
var _pause_button: Button = null



func _ready() -> void:
	# 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)
	
	# 몬스터 생성 일시 정지, 게임 재시작 및 모든 유닛 삭제 버튼 런타임 생성
	var bottom_bar: Control = get_node_or_null("BottomBar") as Control
	if bottom_bar:
		_pause_button = Button.new()
		_pause_button.name = "PauseSpawningButton"
		_pause_button.text = "Pause Spawning"
		bottom_bar.add_child(_pause_button)
		_pause_button.pressed.connect(_on_pause_spawning_pressed)
		
		var restart_game_button: Button = Button.new()
		restart_game_button.name = "RestartGameButton"
		restart_game_button.text = "Restart Game"
		bottom_bar.add_child(restart_game_button)
		restart_game_button.pressed.connect(_on_restart_game_pressed)
		
		var clear_units_button: Button = Button.new()
		clear_units_button.name = "ClearUnitsButton"
		clear_units_button.text = "Clear All Units"
		bottom_bar.add_child(clear_units_button)
		clear_units_button.pressed.connect(_on_clear_units_pressed)

# 골드 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() % DataManager.unit_templates.size()
		var chosen_template: UnitData = DataManager.unit_templates[random_index]
		
		# 유닛 객체 스폰 (Striker 및 Guardian 전용 씬 분기 분할)
		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
		elif chosen_template.unit_id == "Unit_Guardian":
			var guardian_scene: PackedScene = load("res://src/entities/units/guardian/guardian_unit.tscn") as PackedScene
			if guardian_scene:
				target_scene = guardian_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_game_pressed() -> void:
	GameManager.restart_game()

# 모든 유닛 삭제 버튼 클릭 처리
func _on_clear_units_pressed() -> void:
	GameManager.clear_all_units()

# 게임 결과 팝업 내 재시작 버튼 클릭 처리
func _on_restart_pressed() -> void:
	GameManager.restart_game()

# 몬스터 스폰 일시정지 버튼 클릭 처리
func _on_pause_spawning_pressed() -> void:
	if not _pause_button:
		return
	var stage_mgr: Node = get_node_or_null("../StageManager")
	if stage_mgr and stage_mgr.has_method("toggle_spawning_pause"):
		var is_paused: bool = stage_mgr.call("toggle_spawning_pause")
		if is_paused:
			_pause_button.text = "Resume Spawning"
		else:
			_pause_button.text = "Pause Spawning"
