import { ChatMessage, ChatOptions } from '../types/chat';
import { ExtendedActionContext } from './types';
import { PromptAction } from './PromptAction';
import { evaluateCondition } from '../utils/conditionEvaluator';

export async function executePromptAction<I, O>(
  promptAction: PromptAction<I, O>,
  params: I,
  context: ExtendedActionContext
): Promise<O> {
  if (promptAction.routing && promptAction.routing.length > 0) {
    for (const route of promptAction.routing) {
      if (evaluateCondition(route.condition, { ...context.state, ...params })) {
        if (typeof route.prompt === 'string') {
          return context.executeAction!(route.prompt) as Promise<O>;
        } else {
          return executePromptAction(route.prompt, params, context);
        }
      }
    }
    // If no conditions are met, end execution
    return null as unknown as O;
  }

  // Execute the current prompt if no routing or no conditions met
  const messages: ChatMessage[] = [
    { role: 'system', content: promptAction.content },
    { role: 'user', content: JSON.stringify(params) }
  ];

  const options: ChatOptions = {
    ...promptAction.options,
    ...promptAction.config
  };

  try {
    const result = await context.aiProvider.chat(messages, options);
    return result as O;
  } catch (error) {
    context.logger.error('Error executing prompt action:', error);
    throw error;
  }
}

// Export a test function to verify routing
export function testPromptRouting(promptAction: PromptAction<any, any>, params: any, context: ExtendedActionContext): string {
  let result = 'Routing Test:\n';
  
  if (promptAction.routing && promptAction.routing.length > 0) {
    for (const route of promptAction.routing) {
      const conditionMet = evaluateCondition(route.condition, { ...context.state, ...params });
      result += `Condition "${route.condition}": ${conditionMet ? 'Met' : 'Not Met'}\n`;
      
      if (conditionMet) {
        result += `Routing to: ${typeof route.prompt === 'string' ? route.prompt : route.prompt.name}\n`;
        break;
      }
    }
  } else {
    result += 'No routing defined. Executing current prompt.\n';
  }
  
  return result;
}