import { INode, INodeContext, INodeOutput, NodeStatus } from '../types/index.js';

/**
 * @class BaseNode
 * @description 所有自定义节点的基类，提供基础结构和可选方法
 */
export abstract class BaseNode implements INode {
  abstract id: string; // 节点类型 ID，必须由子类实现

  /**
   * 节点执行的核心逻辑，必须由子类实现
   * @param context - 节点执行上下文
   * @returns 包含状态和输出的 Promise
   */
  abstract execute(context: INodeContext): Promise<INodeOutput>;

  /**
   * 补偿逻辑 (可选)
   * 当工作流需要回滚时调用
   * @param context - 节点执行上下文
   */
  async compensate(context: INodeContext): Promise<void> {
    console.log(`[Node: ${this.id}] Step ${context.stepId} 无补偿逻辑，跳过。`);
    // 默认无操作
  }

  /**
   * 输入验证逻辑 (可选)
   * 在执行前验证输入数据是否符合要求
   * @param input - 节点输入数据
   * @returns 如果验证通过返回 true，否则返回 false
   */
  validateInput(input: Record<string, any>): boolean {
    return true; // 默认总是通过
  }

  /**
   * 执行此节点所需的角色列表 (可选)
   */
  requiredRoles?: string[];
}