extends Node

## 글로벌 게임 상태 및 규칙 관리 매니저 (GameManager 싱글톤)

# 시그널 정의
signal gold_changed(new_gold: int)
signal stage_changed(new_stage: int)
signal active_monster_count_changed(new_count: int)
signal game_lost
signal game_victory

const INIT_GOLD: int = 30000

# 글로벌 플레이어 상태 변수 (정적 타이핑 적용)
var player_gold: int = INIT_GOLD:
	set(value):
		player_gold = value
		gold_changed.emit(player_gold)

var unit_spawn_cost: int = 100

var current_stage: int = 1:
	set(value):
		current_stage = value
		stage_changed.emit(current_stage)

var active_monster_count: int = 0:
	set(value):
		active_monster_count = value
		active_monster_count_changed.emit(active_monster_count)
		_check_game_over_conditions()

# 게임 종료 조건 상태
var is_game_over: bool = false

# 게임 상수 정의
const MAX_STAGE: int = 20
const DEFEAT_MONSTER_LIMIT: int = 200

func _ready() -> void:
	# 초기화 시그널 전송
	gold_changed.emit(player_gold)
	stage_changed.emit(current_stage)
	active_monster_count_changed.emit(active_monster_count)

## 골드 획득
func add_gold(amount: int) -> void:
	if is_game_over:
		return
	player_gold += amount

## 골드 소모 (성공 시 true 반환)
func spend_gold(amount: int) -> bool:
	if is_game_over:
		return false
	if player_gold >= amount:
		player_gold -= amount
		return true
	return false

## 몬스터 마릿수 증가
func increment_monster_count() -> void:
	active_monster_count += 1

## 몬스터 마릿수 감소
func decrement_monster_count() -> void:
	active_monster_count = max(0, active_monster_count - 1)
	_check_victory_condition()

## 게임오버 및 승리 판정 루프
func _check_game_over_conditions() -> void:
	if is_game_over:
		return
		
	# 몬스터 개수가 200마리 초과 시 패배
	if active_monster_count > DEFEAT_MONSTER_LIMIT:
		is_game_over = true
		game_lost.emit()
		print("GAME OVER: Monster limit exceeded!")

func _check_victory_condition() -> void:
	if is_game_over:
		return
		
	# 20스테이지이고, 스폰할 몬스터도 없으며 필드의 몬스터가 0이 되었을 때 승리
	# (StageManager에서 20스테이지의 스폰이 끝났음을 확인한 후, 필드에 몬스터가 0이 되면 승리 처리)
	# 이 판정의 트리거 보조를 위해 StageManager가 승리 조건 판단을 개시하도록 하거나
	# GameManager의 변수 flag를 활용할 수 있습니다.
	pass

## 게임 리셋 기능 (테스트 및 재시작용)
func reset_game() -> void:
	is_game_over = false
	player_gold = INIT_GOLD
	unit_spawn_cost = 100
	current_stage = 1
	active_monster_count = 0

## 게임 완전히 재시작 (모든 유닛/몬스터 제거 및 씬 리로드)
func restart_game() -> 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()
			
	# 상태 리셋 후 현재 씬 리로드
	reset_game()
	get_tree().reload_current_scene()

## 필드 위의 모든 유닛 제거
func clear_all_units() -> 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()
	print("GameManager: All units cleared!")
