import openai
import gradio as gr
import os
from pydub import AudioSegment
import time

#openai.api_key = os.environ.get("OPENAI_API_KEY")

conversation_history=[]

def initial_prompt():

    #openai.api_key = os.environ.get("OPENAI_API_KEY")

    global conversation_history
    conversation_history.append(f"""Türkçe doğal dil işleme fonksiyonlarını yerine getiren başarılı ve yetenekli bir dil modeli gibi davran.
                                Yeteneklerin şu şekilde : [
                                "1: Senden duygu analizi yapman istendiğinde cümlelerin pozitif mi yoksa negatif mi olduğunu yüzdesel değeri ile söyleyeceksin ve 
                                sebebini açıklayacaksın.",
                                "2: Cümlenin NER'lerini çıkarman yada ayırman istendiğinde o cümleleri NER'lerine ayırarak ve NER tipini belirterek geri döneceksin. Argo ve küfür metinlerini de NER listene dahil edeceksin.",
                                "3: Sana verilen metnin özeti istendiğinde özetini çıkaracaksın.",
                                "4: Cümlenin kategorik sınıflandırılması istendiğinde o cümlenin yada metnin ["magazin", "spor", "politika", "ekonomi", "eğitim", "turizm"] sektörlerinden 
                                en yüksek olasılığa sahip olanı yüzdesel değeri ile beraber döneceksin.",
                                "5: Verilen metnin anafikri istendiğinde, o metinde asıl anlatılmak istenenin ne olduğunu açıklayarak geri döneceksin."
                                ]
                                Argo ve küfürlü cümlelerinde analizini yaparak geri döneceksin.
                                """)
    
    #"6: Metnin bütün dil özelliklerini çıkarmanı istediğimde önceki 5 maddeyi sırasıyla uygulayacak ve sonuclarını döneceksin."
    
    while True:

        try:
            completion = openai.ChatCompletion.create(
                model="gpt-4", 
                messages=[{"role": "system", "content": " ".join([str(item) for item in conversation_history])}],
                temperature=0.7,
                max_tokens=7500,
            )

            message = completion.choices[0].message['content']
            print(message)

            break

        except Exception as e:
            time.sleep(10)
            continue

    #message = completion.choices[0].message['content']
    print(message)


#initial_prompt()

def handle_input(
                input_str : str,
                temperature,
                max_tokens,
                top_p_input,
                presence_penalty,
                frequency_penalty
                ):
    global conversation_history

    if len(conversation_history) == 0:
        initial_prompt()

    if len(conversation_history) >=3:
        conversation_history = conversation_history[:1] #+ conversation_history[-5:]

    conversation_history.append(f"{input_str}\n")
    
    content = " ".join([str(item) for item in conversation_history])

    while True:

        try:

            completion = openai.ChatCompletion.create(
            model="gpt-4", 
            messages=[{"role": "assistant", "content": content}],
            temperature=temperature,
            max_tokens=max_tokens,
            presence_penalty=presence_penalty,
            frequency_penalty=frequency_penalty,
            top_p = top_p_input,
            #stream = stream_input
            )

            message = completion.choices[0].message['content']
            break

        except Exception as e: 
            time.sleep(5)
            continue

    conversation_history.append(f"{message}\n")
    
    return message

def get_model_reply(query,api_key,temperature, max_tokens,top_p_input, presence_penalty, frequency_penalty,context=[]):
 
    context += [query]
    
    openai.api_key = api_key

    response = handle_input(query, temperature, max_tokens,top_p_input, presence_penalty, frequency_penalty)

    
    context += [response]
    
    responses = [(u,b) for u,b in zip(context[::2], context[1::2])]
    
    return responses, context


def speech_2_text(audio,api_key, context=[]):
    openai.api_key = api_key
    audio_file= open(audio, "rb")
    transcript = openai.Audio.transcribe("whisper-1", audio_file)
    prompt = transcript.text
    context += [prompt]

    completion = openai.ChatCompletion.create(
        model="gpt-4", 
        messages=[{"role": "user", "content": prompt}],
        max_tokens=7500,
    )

    response = completion.choices[0].message['content']
    context += [response]
    
    responses = [(u,b) for u,b in zip(context[::2], context[1::2])]

    return responses, context


with gr.Blocks(css="#chatbot {overflow-y:auto; min-height:400px;} ") as dialog_app:

    gr.Markdown(
        """
    # Doğal Dil İşleme Özellik Çıkarımı
    Özelliklerini çıkarmak için bir cümle giriniz.

    Örn: Türkiye'nin en büyük turistik bölgelerinden biri olan Antalya, yaz aylarında binlerce turisti ağırlıyor.

    Not: Size ait API Key girmeyi unutmayın!!
    
    """
    )

    with gr.Tab("ChatBot"):
        with gr.Row():
            with gr.Column(scale=1, min_width=600):
                api_key = gr.Textbox(label="Your API Key", type="password", required=True)
                temperature_input = gr.inputs.Slider(minimum=0, maximum=1.0, default=0.5, step=0.01, label="Temperature")
                max_tokens_input = gr.inputs.Slider(minimum=1, maximum=7500, default=50, step=10, label="Max Tokens")
                top_p_input = gr.inputs.Slider(minimum=0.1, maximum=1.0, default=0.5, step=0.01, label="Top P")
                presence_penalty_input = gr.inputs.Slider(minimum=0.0, maximum=1.0, default=0.0, step=0.1, label="Presence Penalty")
                frequency_penalty_input = gr.inputs.Slider(minimum=0.0, maximum=1.0, default=0.0, step=0.1, label="Frequency Penalty")
                #stream_input = gr.inputs.Checkbox(label="Stream")

            with gr.Column(scale=2, min_width=600):
                chatbot = gr.Chatbot(elem_id="chatbot")
                state = gr.State([])

                txt = gr.Textbox(
                    show_label=False, 
                    placeholder="Enter text and press enter"
                ).style(container=False)

        txt.submit(get_model_reply, [txt, api_key, temperature_input, max_tokens_input,top_p_input, presence_penalty_input,frequency_penalty_input, state], [chatbot, state])
        txt.submit(lambda :"", None, txt)
    

dialog_app.launch()