import { StructuredPrompt } from './StructuredPrompt';
import { PromptDefinition } from '../types/common';

export class PromptRegistry {
  private prompts: Map<string, StructuredPrompt> = new Map();

  register(prompt: StructuredPrompt): void {
    this.prompts.set(prompt.definition.name, prompt);
  }

  get(name: string): StructuredPrompt {
    const prompt = this.prompts.get(name);
    if (!prompt) {
      throw new Error(`Prompt not found: ${name}`);
    }
    return prompt;
  }

  getAllPrompts(): StructuredPrompt[] {
    return Array.from(this.prompts.values());
  }

  getPromptNames(): string[] {
    return Array.from(this.prompts.keys());
  }

  removePrompt(name: string): boolean {
    return this.prompts.delete(name);
  }

  clear(): void {
    this.prompts.clear();
  }

  size(): number {
    return this.prompts.size;
  }

  getPromptsSortedByPriority(): StructuredPrompt[] {
    return this.getAllPrompts().sort((a, b) => {
      const priorityA = a.getPriority() ?? 0;
      const priorityB = b.getPriority() ?? 0;
      return priorityB - priorityA; // Sort in descending order
    });
  }

  getHighestPriorityPrompt(): StructuredPrompt | undefined {
    const sortedPrompts = this.getPromptsSortedByPriority();
    return sortedPrompts[0];
  }

  getPromptsByConfig(config: Partial<NonNullable<PromptDefinition['config']>>): StructuredPrompt[] {
    return this.getAllPrompts().filter(prompt => {
      const promptConfig = prompt.getConfig();
      if (!promptConfig) return false;
      return Object.entries(config).every(([key, value]) => 
        promptConfig[key as keyof PromptDefinition['config']] === value
      );
    });
  }
}