const BaseAction = require('../core/base-action');
const { ConfigurationError, TimeoutError } = require('../core/errors');

/**
 * 自定义动作 - 调用适配器中的自定义函数
 * 支持超时保护，防止用户代码死循环
 */
class CustomAction extends BaseAction {
  async execute() {
    const handler = this.config.handler;
    const params = this.config.params || {};
    const timeout = this.config.timeout || 300000; // 默认5分钟超时
    
    if (!handler) {
      throw new ConfigurationError('缺少处理函数名称', 'handler', {
        action: 'custom',
        config: this.config
      });
    }
    
    this.log('info', `执行自定义函数: ${handler}`);
    
    // 检查适配器中是否存在该函数
    if (typeof this.context.adapter[handler] !== 'function') {
      throw new ConfigurationError(
        `自定义处理函数不存在: ${handler}`,
        `adapter.${handler}`,
        { availableHandlers: Object.keys(this.context.adapter) }
      );
    }
    
    // 使用 Promise.race 实现超时保护
    const timeoutPromise = new Promise((_, reject) => {
      setTimeout(() => {
        reject(new TimeoutError(`自定义函数: ${handler}`, timeout, {
          handler,
          params
        }));
      }, timeout);
    });
    
    try {
      // 竞速执行：函数完成 vs 超时
      const result = await Promise.race([
        this.context.adapter[handler](params),
        timeoutPromise
      ]);
      
      this.log('debug', '✓ 自定义函数执行完成');
      return result;
      
    } catch (error) {
      if (error.message.includes('执行超时')) {
        this.log('error', `⚠️ ${error.message}`);
      }
      throw error;
    }
  }
}

module.exports = CustomAction;
