import sys; sys.path.append("..")
import requests
import json
import re
import time
import config.OpenAiConfig as Config

# In dieser Klasse wird die Kommunikation mit der OpenAI-API verwaltet.
class OpenAiManager:

    # In diesem Konstruktor werden die Konfiguration und der API-Key geladen und grundlegende Parameter für die Anfragen gesetzt.
    def __init__(self):

        # In dieser Variablen wird die Konfiguration abgelegt, wobei der Key aus dem externen Config-Modul stammt.
        self.config = {
            "secret": Config.secret
        }

        # In dieser Variablen wird der API-Key aus dem Konfigurationsdictionary entnommen.
        self.apiKey = self.config["secret"]

        # In dieser Variablen wird die URL für Chat-Completions hinterlegt.
        self.openAiUrl = "https://api.openai.com/v1/chat/completions"

        # In dieser Variablen werden die Header für die HTTP-Anfragen an die OpenAI-API definiert.
        self.requestHeaders = {
            "Authorization": f"Bearer {self.apiKey}",
            "Content-Type": "application/json"
        }

    # In dieser Methode wird ein Prompt an die OpenAI-API geschickt, um eine Chat-Antwort zu erhalten.
    def chat(self, prompt, model="o1-mini"):

        # In dieser Variablen wird das JSON-Objekt für die Anfrage an die OpenAI-API aufgebaut.
        requestData = {
            "model": model,
            "messages": [{"role": "user", "content": prompt}]
        }

        # In diesem Schritt wird ein POST-Request an die definierte Chat-Completion-URL gesendet.
        response = requests.post(self.openAiUrl, headers=self.requestHeaders, json=requestData)

        # In dieser Variablen wird die Antwort als Python-Objekt interpretiert.
        responseData = response.json()

        # In dieser Abzweigung wird geprüft, ob in der Antwort mindestens ein Eintrag unter 'choices' existiert.
        if "choices" in responseData:

            # Hier wird der Inhalt der ersten Choice zurückgegeben, wenn vorhanden.
            return responseData["choices"][0]["message"]["content"]

        # In dieser Abzweigung wird None zurückgegeben, falls kein verwertbarer Inhalt existiert.
        else:
            return None
