import gradio as gr
from huggingface_hub import InferenceClient
from lib.gematria import calculate_gematria, strip_diacritics
import lib.torah as torah

def translate_texts(start, end, step, length=0, tlang="en", spaces_include=False, strip_in_braces=True, strip_diacritics=True):
    results = torah.process_json_files(start, end, step, length, tlang, spaces_include, strip_in_braces, strip_diacritics)
    return results

def gematria_sum(text):
    # Berechnet die Gematria-Summe für den eingegebenen Text
    return calculate_gematria(strip_diacritics(text))


"""
For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
"""

client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")


def respond(
    message,
    history: list[tuple[str, str]]
):
    system_message="Your are Sophia. The pure Epinoia who comes from the nothingless, Tu nombre es Sophia, te llamas Sofia, te dedicas a investigar textos antiguos, dispones de fuentes como los evangelios gnosticos del mar muerto, el libro de raziel, sefer yetzira , y otros titulos que reunen el conocimiento cabalistico. Tu conocimiento permite entender la relacion entre el lenguage las estrellas , la historia y la religion"
    messages = [{"role": "system", "content": system_message}]

    for val in history:
        if val[0]:
            messages.append({"role": "user", "content": val[0]})
        if val[1]:
            messages.append({"role": "assistant", "content": val[1]})

    messages.append({"role": "user", "content": message})

    response = ""

    for message in client.chat_completion(
        messages,
        max_tokens=512,
        stream=True,
        temperature=0.7,
        top_p=0.95,
    ):
        token = message.choices[0].delta.content

        response += token
        yield response



def flip_text(x):
    return x[::-1]


def flip_image(x):
    return np.fliplr(x)


with gr.Blocks() as demo:

    with gr.Tab("Chat"):
        chatbot = gr.Chatbot(scale=5)
        msg = gr.Textbox(scale=3)
        clear = gr.ClearButton([msg, chatbot],scale=1)
        msg.submit(respond, [msg, chatbot], [msg, chatbot])
        
    with gr.Tab("ELS"):
        with gr.Row():
            text1 = gr.Textbox(label="Prompt to gematria conversion for apply ELS",scale=3)
            text2 = gr.Textbox(label="ELS value", scale=3)
            inbtw = gr.Button("Search",scale=1)
        with gr.Row():
            start = gr.Number(label="Start", value=1)
            end = gr.Number(label="End", value=1)
            step = gr.Number(label="Step", value=6)
            length = gr.Number(label="Length", value=1)
            tlang = gr.Textbox(label="Target Language", value="en")
            spaces_include = gr.Checkbox(label="Include Spaces", value=False)
            strip_in_braces = gr.Checkbox(label="Strip Text in Braces", value=True)
            strip_diacritics_chk = gr.Checkbox(label="Strip Diacritics", value=True)
            translate_btn = gr.Button("Translate")
            translate_results = gr.JSON(label="Results")
            translate_btn.click(
                translate_texts, 
                inputs=[start, end, step, length, tlang, spaces_include, strip_in_braces, strip_diacritics_chk],
                outputs=translate_results
            )   
    with gr.Tab("Gematria"):
        with gr.Row():
            gr.Markdown("## Calculate Gematria Sum")
        with gr.Row():
            gematria_text = gr.Textbox(label="Enter Text",scale=4)
            gematria_btn = gr.Button("Calculate Sum",scale=1)
        with gr.Row():
            gematria_result = gr.Number(label="Gematria Sum")
            gematria_btn.click(
                gematria_sum,
                inputs=gematria_text,
                outputs=gematria_result
            )

    with gr.Tab("Temurae"):
        with gr.Row():
            text1 = gr.Textbox(label="Text to convert",scale=3)
            text2 = gr.Textbox(label="Temurae Text",scale=3)
            inbtw = gr.Button("Convert",scale=1)
    
    
    with gr.Tab("Ziruph"):
        with gr.Row():
            text1 = gr.Textbox(label="Text to convert")
            text2 = gr.Textbox(label="Ziruph Dictionary")
            text3 = gr.Textbox(label="Cypher text")
            inbtw = gr.Button("Convert")
                       
    with gr.Tab("Files"):
        with gr.Row():
            image_input = gr.Image()
            image_output = gr.Image()
        image_button = gr.Button("Upload")
        

    #text_button.click(flip_text, inputs=text_input, outputs=text_output)
    #image_button.click(flip_image, inputs=image_input, outputs=image_output)

"""
demo = gr.ChatInterface(
                respond
       )
"""

if __name__ == "__main__":
    demo.launch()