using System;
using System.Threading;
using System.Threading.Tasks;
namespace BaseGames.UI
{
///
/// 统一 UI 导航栈服务。所有面板(主菜单子面板 + 游戏内面板)经此压栈/出栈,
/// 由它统一保证:只有栈顶可交互、下层被屏蔽出导航图、ESC 逐层回退、出栈恢复焦点。
///
/// 设计要点:
///
/// - 单一取消入口:导航器是 EVT_UICancelPressed 的唯一消费者,ESC 只关栈顶一层。
/// - 场景作用域:面板可能位于会被卸载的关卡 / 主菜单场景,导航器订阅 sceneUnloaded
/// 清理随场景销毁的栈层,每次操作对已销毁面板兜底。
/// - 非面板的"底层上下文"(如主菜单按钮组、游戏内 HUD)不入栈,由各自上下文
/// 订阅 / 读 自行屏蔽。
///
///
public interface IUINavigator
{
/// 当前栈顶面板;空栈为 null。
UIPanelBase Top { get; }
/// 栈深度(已打开的面板层数)。
int Depth { get; }
/// 栈结构变化(任何 Push / Pop / 场景清理)后触发,供底层上下文屏蔽自身。
event Action StackChanged;
/// 压栈打开面板。 为空时用面板自身 。
void Push(UIPanelBase panel, PushMode? mode = null);
/// 关闭栈顶并恢复下层(若有)。空栈无操作。
void Pop();
/// 清空整个栈(逐层关闭)。
void PopToRoot();
///
/// 压栈打开结果面板并等待玩家给出结果(确认 / 选择)。
/// 面板被出栈(含 ESC 取消)、被销毁或 取消时,
/// 以面板的取消默认值兜底完成,绝不悬挂 await。
///
Task PushForResultAsync(UIResultPanel panel, CancellationToken ct = default);
}
}