## EventBus — 全局事件总线（Autoload: EventBus）
## 权威接口定义：architecture_design.md §6.2
##
## 使用约定：
##   - 订阅：EventBus.subscribe(EventID.ENEMY_KILLED, _on_enemy_killed)
##   - 发送：EventBus.emit(EventID.ENEMY_KILLED, {"entity_id": id})
##   - 取消：EventBus.unsubscribe(EventID.ENEMY_KILLED, _on_enemy_killed)
extends Node

var _listeners: Dictionary = {}  # { event_id: int → Array[Callable] }

func subscribe(event_id: int, callback: Callable) -> void:
	if not _listeners.has(event_id):
		_listeners[event_id] = []
	var arr: Array = _listeners[event_id]
	if not arr.has(callback):
		arr.append(callback)

func unsubscribe(event_id: int, callback: Callable) -> void:
	if not _listeners.has(event_id):
		return
	_listeners[event_id].erase(callback)

func emit(event_id: int, payload: Dictionary = {}) -> void:
	if not _listeners.has(event_id):
		return
	var arr: Array = _listeners[event_id]
	# 逆序迭代防止回调内部 unsubscribe 导致跳过
	for i in range(arr.size() - 1, -1, -1):
		arr[i].call(payload)

## C# 批量通知接口：一次调用发送多个事件（ADR-L1 规则3）
## events: Array of [event_id: int, payload: Dictionary]
func emit_batch(events: Array) -> void:
	for ev in events:
		var eid: int = ev[0]
		var pay: Dictionary = ev[1] if ev.size() > 1 else {}
		emit(eid, pay)

## 清空所有订阅（关卡结束 / 场景切换时调用）
func reset() -> void:
	_listeners.clear()
