package tech.easyflow.ai.plugin.workflow.dependency;

import tech.easyflow.ai.entity.Plugin;
import tech.easyflow.ai.vo.OfflineImpactBindingVo;

import java.math.BigInteger;
import java.util.List;
import java.util.Set;

/**
 * 工作流插件依赖分析服务。
 */
public interface WorkflowPluginDependencyService {

    /**
     * 查询被某个工作流引用的插件列表。
     *
     * @param workflowId 工作流 ID
     * @return 插件引用列表
     */
    List<OfflineImpactBindingVo> listPluginsByWorkflowId(BigInteger workflowId);

    /**
     * 解析工作流内容中通过插件间接引用到的工作流 ID。
     *
     * @param content 工作流内容
     * @return 引用到的工作流 ID 集合
     */
    Set<String> extractWorkflowIdsFromPluginNodes(String content);

    /**
     * 判断工作流内容是否引用了指定插件。
     *
     * @param content  工作流内容
     * @param pluginId 插件 ID
     * @return 是否引用
     */
    boolean containsPluginReference(String content, BigInteger pluginId);

    /**
     * 判断某个工作流是否经由子流程/工作流插件链路递归引用了指定插件。
     *
     * @param workflowId 工作流 ID
     * @param pluginId   插件 ID
     * @return 是否存在递归引用
     */
    boolean containsPluginReferenceTransitively(BigInteger workflowId, BigInteger pluginId);

    /**
     * 判断某个工作流的已发布快照是否经由子流程/工作流插件链路递归引用了指定插件。
     *
     * @param workflowId 工作流 ID
     * @param pluginId   插件 ID
     * @return 是否存在递归引用
     */
    boolean containsPluginReferenceTransitivelyInPublishedSnapshot(BigInteger workflowId, BigInteger pluginId);

    /**
     * 查询工作流插件。
     *
     * @param pluginId 插件 ID
     * @return 插件
     */
    Plugin getWorkflowPlugin(BigInteger pluginId);

    /**
     * 根据插件工具 ID 解析目标工作流 ID。
     *
     * @param pluginItemId 插件工具 ID
     * @return 工作流 ID
     */
    String resolveWorkflowIdByPluginItemId(String pluginItemId);
}
