using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using TeamAAS.FlowEditor.Execution;
using TeamAAS.FlowEditor.Models;
using TeamAAS.FlowEditor.Plugins;
using TeamAAS.FlowEngine.Execution;
namespace TeamAAS.FlowEngine.Interfaces
{
///
/// 流程插件加载器接口:负责扫描、注册、实例化流程节点插件(IFlowNodePlugin),
/// 并统一管理当前打开的所有流程 Tab,支撑执行器和组合模块的跨流程查询。
///
public interface IPluginLoader
{
///
/// 当前插件目录是否已经加载过(防止重复扫描)。
///
bool IsLoaded { get; }
///
/// 所有已发现的插件描述(只读快照)。
///
IReadOnlyList Descriptors { get; }
///
/// 当前打开的所有流程 Tab(编辑器/执行器共用,可绑定到 UI)。
///
ObservableCollection FlowTabs { get; set; }
///
/// 组合模块编辑时,记录当前子流程对应的组合模块 PluginModel,
/// 公式编辑器据此区分「编辑子流程节点属性」和「编辑组合模块输出」场景。
///
FlowGraph SetGroupPluginModel { get; set; }
///
/// 组合模块编辑时,记录外层组合模块的 Model,用于 InputSourceDataProvider
/// 查询主流程中组合模块的前置节点结果。
///
BasePluginModel ParentGroupModel { get; set; }
///
/// 当前在 PropertyGrid 中选中的节点(公式编辑器用它判断上下文)。
///
FlowNode SelectFlow { get; set; }
///
/// 从指定目录加载所有插件 DLL,并扫描 AppDomain 中已加载的程序集。
/// 清理非插件 DLL/.pdb,避免目录脏乱。只在首次调用时执行。
///
/// 插件目录路径(通常是 EXE 下的 Plugins)
void LoadFrom(string pluginsPath);
///
/// 按显示名称创建插件实例(不带模型初始化)。找不到返回 null。
///
IFlowNodePlugin CreateInstance(string displayName);
///
/// 按显示名称获取插件描述信息(含 PluginType、Attribute 元数据)。找不到返回 null。
///
PluginDescriptor GetDescriptor(string displayName);
///
/// 获取所有已注册插件的 UI 展示信息(工具箱绑定用)。
///
List GetAllPluginInfos();
///
/// 获取单个插件的 UI 展示信息。找不到返回 null。
///
NodePluginInfo GetPluginInfo(string displayName);
///
/// 通过流程名称获取对应的 FlowTabItem(不存在返回 null)。
///
FlowTabItem GetFlowTab(string flowName);
///
/// 通过流程名称获取一个新的执行器(基于 FlowGraph 构造 FlowExecutor)。
/// 流程或图不存在返回 null。
///
FlowExecutor GetFlowExecutor(string flowName);
///
/// 获取所有已打开流程的名称列表(用于下拉框、日志输出等)。
///
List GetFlowNames();
///
/// 查找指定节点的首个后继节点插件实例(按连线先后顺序,只返回第一个)。
/// 用于条件跳转、组合模块子流程等只取一条后继的场景。
///
/// 流程名称
/// 节点 NodeId
IFlowNodePlugin GetPluginTool(string flowName, string nodeId);
///
/// 通过 FlowId + NodeId 获取所有后继节点列表。
/// 自动在 FlowTabs 顶层图以及所有组合模块 SubGraph 中递归查找,
/// 找不到目标图时返回空列表。
///
/// 目标图 GraphId(主流程或组合模块子流程皆可)
/// 起点节点 NodeId
List IDGetNextPlugins(string flowId, string nodeId);
}
}