import * as path from 'path';
import { ILogger, Tool, StructuredPrompt } from '../types';
import { initializeTools } from './tools';
import { loadPrompts } from './promptLoader';

export class ToolAndPromptLoader {
  constructor(private logger: ILogger) {}

  async initializeToolsAndPrompts(toolsPath?: string, promptsPath?: string): Promise<{ tools: Record<string, Tool>, prompts: Record<string, StructuredPrompt> }> {
    const currentDir = process.cwd();
    const defaultToolsPath = path.join(currentDir, 'src', 'config', 'tools.json');
    const defaultPromptsPath = path.join(currentDir, 'src', 'config', 'prompts.json');

    const finalToolsPath = toolsPath || defaultToolsPath;
    const finalPromptsPath = promptsPath || defaultPromptsPath;

    this.logger.info(`Initializing tools from: ${finalToolsPath}`);
    this.logger.info(`Initializing prompts from: ${finalPromptsPath}`);

    const tools = await initializeTools(finalToolsPath);
    const loadedPrompts = await loadPrompts(finalPromptsPath);
    
    this.logger.info(`Loaded ${loadedPrompts.length} prompts`);
    
    const prompts: Record<string, StructuredPrompt> = {};
    for (const prompt of loadedPrompts) {
      prompts[prompt.name] = prompt;
      this.logger.debug(`Loaded prompt: ${prompt.name}`);
    }
    
    if ('executeTask' in prompts) {
      this.logger.info("'executeTask' prompt successfully loaded");
    } else {
      this.logger.warn("'executeTask' prompt not found in loaded prompts");
    }
    
    this.logger.info(`Initialized ${Object.keys(tools).length} tools and ${Object.keys(prompts).length} prompts`);
    this.logger.debug(`Loaded prompt names: ${Object.keys(prompts).join(', ')}`);

    return { tools, prompts };
  }
}