# main_menu.gd
extends Control

@onready var ui_main = get_tree().get_first_node_in_group("UI_MAIN")
# 添加一个新的内部信号，供 ui_main 或其他需要监听菜单按钮点击的脚本使用
# 参数 button_id 将是映射后的逻辑动作 ID (例如 "task_development", "NA", "action_hire")
# 如果按钮未在映射表中定义，则不发出此信号。
signal _internal_button_pressed(button_id: String)

# 定义按钮 ID 到逻辑动作 ID 的映射
# !!! 非常重要: 请根据你的游戏设计，补充完整所有二级菜单按钮的映射关系 !!!
const MAIN_MENU_TO_POPUP = {
	# --- 开发 ---
	"layer_2_button_1_Button1": "task_development",  # 新项目
	"layer_2_button_1_Button2": "task_commissioned", # 接外包
	# --- 运营 ---
	"layer_2_button_2_Button1": "action_marketing",   # 广告宣传 (示例，请替换为实际ID)
	"layer_2_button_2_Button2": "action_use_item",    # 使用道具 (示例，请替换为实际ID)
	"layer_2_button_2_Button3": "action_change_seat", # 调换座位 (示例，请替换为实际ID)
	# --- 团队 ---
	"layer_2_button_3_Button1": "action_training",    # 培训 (示例，请替换为实际ID)
	"layer_2_button_3_Button2": "action_upgrade",     # 升级 (示例，请替换为实际ID)
	"layer_2_button_3_Button3": "action_hire",        # 雇佣 (示例，请替换为实际ID)
	"layer_2_button_3_Button4": "action_fire",        # 解雇 (示例，请替换为实际ID)
	# --- 信息 ---
	"layer_2_button_4_Button1": "info_past_projects", # 过往产品 (示例，请替换为实际ID)
	"layer_2_button_4_Button2": "info_staff",         # 职员信息 (示例，请替换为实际ID)
	"layer_2_button_4_Button3": "info_market_research",# 市场调查 (示例，请替换为实际ID)
	"layer_2_button_4_Button4": "info_awards",        # 荣誉信息 (示例，请替换为实际ID)
	# --- 设置 ---
	"layer_2_button_5_Button1": "action_save_game",   # 保存 (示例，请替换为实际ID)
	"layer_2_button_5_Button2": "action_change_settings",# 更改设定 (示例，请替换为实际ID)
	"layer_2_button_5_Button3": "action_show_help",   # 游戏说明 (示例，请替换为实际ID)
	"layer_2_button_5_Button4": "action_show_records",# 记录 (示例，请替换为实际ID)
	"layer_2_button_5_Button5": "action_quit_game"    # 结束游戏 (示例，请替换为实际ID)
	# --- 如果有标记为 "NA" 的按钮，保留 "NA" 或替换为实际 ID ---
	# "layer_2_button_x_ButtonY": "NA"
}

# --- Node References ---
@onready var layers_container = $layers
@onready var layer1_buttons = [
	$layers/layer_1/Button_1/Button,
	$layers/layer_1/Button_2/Button,
	$layers/layer_1/Button_3/Button,
	$layers/layer_1/Button_4/Button,
	$layers/layer_1/Button_5/Button,
]
@onready var layer2_menus = [
	$layers/layer_2_button_1,
	$layers/layer_2_button_2,
	$layers/layer_2_button_3,
	$layers/layer_2_button_4,
	$layers/layer_2_button_5,
]

# --- State Variables ---
var pop_up_list: Array = [] # 用于追踪当前打开的二级菜单，支持右键返回
var is_active: bool = false # 标记菜单当前是否处于激活状态

# --- Godot Lifecycle Methods ---
func _ready():
	# 将自身节点添加到同名分组，方便其他脚本查找 (如果需要)
	var node_name = str(self.name)
	add_to_group(node_name)

	# 连接一级菜单按钮的 pressed 信号
	for i in range(layer1_buttons.size()):
		var button = layer1_buttons[i]
		if button and button is Button:
			# 使用 bind 将按钮索引传递给处理函数
			button.pressed.connect(_on_layer1_button_pressed.bind(i))
		else:
			push_warning("play_menu: Layer 1 button at index %d not found or not a Button." % i)

	# 连接所有二级菜单按钮的 pressed 信号
	_connect_all_layer2_buttons()

	# 初始化状态：菜单默认隐藏，不处理输入
	#self.visible = false
	set_process_input(false)

	# 确保所有二级菜单初始时也是隐藏的
	for menu in layer2_menus:
		if menu: menu.visible = false

func _input(event):
	# 只在菜单激活时处理输入
	if not is_active: return

	# 处理右键点击事件
	if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT and event.is_pressed():
		if pop_up_list.size() > 0:
			# 如果有二级菜单打开，关闭最上层的二级菜单
			var layer2_to_close = pop_up_list.pop_back()
			if layer2_to_close and is_instance_valid(layer2_to_close):
				layer2_to_close.visible = false
				print("play_menu: Closed layer 2 via right-click: ", layer2_to_close.name)
			# 标记事件已处理，防止传递给游戏世界
			get_viewport().set_input_as_handled()
		else:
			# 如果没有二级菜单打开，关闭整个主菜单
			print("play_menu: Closing self via right-click.")
			hide_menu()
			# 标记事件已处理
			get_viewport().set_input_as_handled()

# --- Public Methods ---
func show_menu():
	"""显示主菜单，暂停游戏，并准备接收输入。"""
	print("play_menu: Showing menu.")
	self.visible = true
	is_active = true
	_hide_all_layer2() # 确保打开时所有二级菜单是隐藏的
	pop_up_list.clear() # 清空二级菜单记录
	set_process_input(true) # 开始处理输入事件 (用于右键关闭等)
	# 暂停游戏逻辑 (假设有一个全局的 GameState 单例)
	if GameState: GameState.pause_game()

func hide_menu():
	"""隐藏主菜单，恢复游戏，并停止处理输入。"""
	if not is_active: return # 如果已经隐藏，则不执行任何操作
	print("play_menu: Hiding menu.")
	self.visible = false
	is_active = false
	_hide_all_layer2() # 确保关闭时所有二级菜单都隐藏
	pop_up_list.clear() # 清空二级菜单记录
	set_process_input(false) # 停止处理输入事件
	# 恢复游戏逻辑
	if GameState: GameState.resume_game()

# --- Internal Logic ---
func _connect_all_layer2_buttons():
	"""遍历所有二级菜单，连接其下按钮的 pressed 信号。"""
	for i in range(layer2_menus.size()):
		var layer2_menu = layer2_menus[i]
		if layer2_menu:
			# 遍历二级菜单下的所有子节点
			for j in range(layer2_menu.get_child_count()):
				var button = layer2_menu.get_child(j)
				# 确保子节点是按钮类型
				if button is Button:
					# 构建一个唯一的按钮 ID，基于其在场景树中的路径 (或自定义规则)
					# 这里的命名规则与 tscn 文件中的节点名称对应
					var button_id = "layer_2_button_%d_Button%d" % [i + 1, j + 1]
					# 检查是否已连接，避免重复连接 (虽然 Godot 内部可能处理，但显式检查更安全)
					if not button.pressed.is_connected(_on_layer2_button_pressed):
						# 连接信号，并使用 bind 传递唯一的 button_id
						button.pressed.connect(_on_layer2_button_pressed.bind(button_id))
		else:
			push_warning("play_menu: Layer 2 menu node at index %d not found for connection." % i)

func _hide_all_layer2():
	"""隐藏所有二级菜单。"""
	for menu in layer2_menus:
		if menu: menu.visible = false

func _on_layer1_button_pressed(button_index: int):
	"""处理一级菜单按钮点击事件。"""
	if not is_active: return # 菜单未激活时不响应
	print("play_menu: Layer 1 button pressed: index ", button_index)

	# 先隐藏所有已打开的二级菜单，并清空记录
	_hide_all_layer2()
	pop_up_list.clear()

	# 检查按钮索引是否有效
	if button_index >= 0 and button_index < layer2_menus.size():
		var target_layer2_node = layer2_menus[button_index]
		if target_layer2_node:
			# 显示对应的二级菜单
			target_layer2_node.visible = true
			# 将其添加到弹出列表，用于右键返回
			pop_up_list.append(target_layer2_node)
			print("play_menu: Showing layer 2: ", target_layer2_node.name)
		else:
			# 如果对应的二级菜单节点不存在 (理论上不应发生，除非 tscn 结构错误)
			push_warning("play_menu: Target Layer 2 node for index ", button_index, " not found!")
	else:
		# 如果按钮索引无效 (理论上不应发生)
		push_warning("play_menu: Invalid Layer 1 button index: ", button_index)

func _on_layer2_button_pressed(button_id: String):
	"""处理二级菜单按钮点击事件。"""
	if not is_active: return # 菜单未激活时不响应

	# 1. 将内部按钮 ID 映射到逻辑动作 ID
	var final_id_to_emit = map_button_id_to_popup(button_id)

	# 打印调试信息，显示原始 ID 和映射后的 ID
	print("play_menu: Layer 2 button pressed (original: %s). Mapped ID: %s" % [button_id, final_id_to_emit])

	# 2. 进行窗口操作
	hide_menu()
	ui_main.show_popup(final_id_to_emit)

	emit_signal("_internal_button_pressed", final_id_to_emit)

func map_button_id_to_popup(button_id: String):
	"""
	将内部使用的、基于 UI 结构的按钮 ID 映射为具有业务逻辑含义的动作 ID。
	Args:
		button_id (String): 例如 "layer_2_button_1_Button1"。
	Returns:
		String: 映射后的逻辑动作 ID (例如 "task_development", "NA")，
				如果 button_id 未在 MAIN_MENU_TO_POPUP 中定义，则返回 null。
	"""
	# 使用 .get() 方法安全地从字典中获取值
	# 如果键 (button_id) 不存在，get() 返回第二个参数指定的默认值 (这里是 null)
	var mapped_id = MAIN_MENU_TO_POPUP.get(button_id, null)

	if mapped_id == null:
		# 如果映射表中没有找到对应的条目，发出警告并返回 null
		push_warning("play_menu: Button ID '%s' not found in MAIN_MENU_TO_POPUP mapping. Please define it." % button_id)
		return null
	else:
		# 如果找到了条目 (无论是具体动作 ID 还是 "NA")，直接返回该值
		return mapped_id
