// Define the structure of the raw input
export interface RawData {
  message: {
    content: string;
    role: string;
  };
  usage: {
    promptTokens: number;
    completionTokens: number;
    totalTokens: number;
  };
  raw: unknown;
}

// Adapter class to extract content values
export class LlmResponseAdapter {
  constructor(private rawData: RawData) {}

  extractContent(): string | object {
    const procesedContent = this.parseIfJsonOrMarkdown(
      this.rawData.message.content
    );
    
    if (typeof procesedContent === "string") {
      return this.tryParseJson(procesedContent);
    }

    return procesedContent;
  }

  private parseIfJsonOrMarkdown(text: string): string | object {
    const jsonRegex = /```json\s([\s\S]*?)```/;
    const markdownRegex = /```markdown\s([\s\S]*?)```/;

    const jsonMatch = text.match(jsonRegex);

    if (jsonMatch) {
      try {
        return JSON.parse(jsonMatch[1].trim());
      } catch {
        return text; // Return original text if parsing fails
      }
    }

    const markdownMatch = text.match(markdownRegex);
    if (markdownMatch) {
      return markdownMatch[1].trim(); // Extract Markdown text
    }

    return text;
  }

  private tryParseJson(text: string): object | string {
    try {
      return JSON.parse(text);
    } catch {
      return text; // Return original text if parsing fails
    }
  }
}
