from openai import OpenAI, chat
from flask import jsonify, Blueprint
import os
from flask_socketio import send, emit

current_directory = os.path.dirname(os.path.abspath(__file__))
config_directory = os.path.expanduser("~/.config/fabric")
api_key_file = os.path.join(config_directory, ".env")
with open(api_key_file, "r") as f:
    apiKey = f.read().split("=")[1]
    client = OpenAI(api_key=apiKey)
bp = Blueprint('chatgpt', __name__)


def sendMessage(system: str, input_data: str, user=''):
    system_message = {"role": "system", "content": system}
    user_message = {"role": "user", "content": f"{user}\n{input_data}"}
    messages = [system_message, user_message]
    try:
        response = client.chat.completions.create(
            model="gpt-4-1106-preview",
            messages=messages,
            temperature=0.0,
            top_p=1,
            frequency_penalty=0.1,
            presence_penalty=0.1
        )
        assistant_message = response.choices[0].message.content
        return jsonify({"response": assistant_message})
    except Exception as e:
        return jsonify({"error": str(e)})


def streamMessage(input_data: str, wisdomFile: str):
    # Similar logic as sendMessage but adapted for streaming
    user_message = {"role": "user", "content": f"{input_data}"}
    wisdom_File = os.path.join(
        current_directory, wisdomFile)
    with open(wisdom_File, "r") as f:
        system = f.read()
        system_message = {"role": "system", "content": system}
    messages = [system_message, user_message]
    try:
        # Note: You need to modify the API call to support streaming
        stream = client.chat.completions.create(
            model="gpt-4-1106-preview",
            messages=messages,
            temperature=0.0,
            top_p=1,
            frequency_penalty=0.1,
            presence_penalty=0.1,
            stream=True
        )
        for chunk in stream:
            if chunk.choices[0].delta.content is not None:
                send(chunk.choices[0].delta.content, end="")
    except Exception as e:
        emit('error', {'data': str(e)})


if 1 == 1:
    from app.chatgpt import routes