import gradio as gr
from pipeline import preprocessing_pipeline, conversational_rag
from pipeline import system_message, user_message
from haystack.dataclasses import ChatMessage
import time
import os

def process_files_into_docs(files, progress=gr.Progress()):
    if isinstance(files, dict):
        files = [files]
    
    if not files:
        return 'No file uploaded!'
        
    preprocessing_pipeline.run({'file_type_router': {'sources': files}})
    return "Database created🤗🤗"

def rag(history, question):
    if history is None:
        history = []
        
    messages = [system_message, user_message]
    res = conversational_rag.run(
        data = {
            'query_rephrase_prompt_builder' : {'query': question},
            'prompt_builder': {'template': messages, 'query': question},
            'memory_joiner': {'values': [ChatMessage.from_user(question)]}
        },
        include_outputs_from=['llm', 'query_rephrase_llm']
    )
    
    bot_message = res['llm']['replies'][0].content
    streamed_message = ""
    
    for token in bot_message.split():
        streamed_message += f"{token} "
        yield history + [(question, streamed_message.strip())], " "
        time.sleep(0.05)
        
    history.append((question, bot_message))
    yield history, " "

EXAMPLE_FILE = "RAG Survey.pdf"

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.HTML("<center><h1>TalkToFiles - Query your documents! 📂📄</h1></center>")
    gr.Markdown("""##### This AI chatbot🤖 can help you chat with your documents. Can upload <b>Text(.txt), PDF(.pdf) and Markdown(.md)</b> files.
    <b>Please do not upload confidential documents.</b>""")
    
    with gr.Row():
        with gr.Column(scale=86):
            gr.Markdown("""#### ***Step 1 - Upload Documents and Initialize RAG pipeline***</br> Can upload Multiple documents""")
            
            with gr.Row():
                file_input = gr.File(
                    label='Upload Files',
                    file_count='multiple',
                    file_types=['.pdf', '.txt', '.md'],
                    interactive=True
                )
                
            with gr.Row():
                process_files = gr.Button('Create Document store')
                
            with gr.Row():
                result = gr.Textbox(label="Document store", value='Document store not initialized')
                
            # Pre-processing Events
            process_files.click(
                fn=process_files_into_docs,
                inputs=file_input,
                outputs=result,
                show_progress=True
            )
            
            # def load_example():
            #     return [EXAMPLE_FILE]
                
            # with gr.Row():
            #     gr.Examples(
            #         examples=[[EXAMPLE_FILE]],
            #         inputs=file_input,
            #         examples_per_page=1,
            #         label="Click to upload an example"
            #     ).dataset.click(fn=load_example, inputs=[], outputs=file_input)
                
        with gr.Column(scale=200):
            gr.Markdown("""#### ***Step 2 - Chat with your docs*** """)
            chatbot = gr.Chatbot(label='ChatBot', type="messages")  # <-- Added type="messages" to fix deprecation
            user_input = gr.Textbox(label='Enter your query', placeholder='Type here...')
            
            with gr.Row():
                submit_button = gr.Button("Submit")
                clear_btn = gr.ClearButton([user_input, chatbot], value='Clear')
                
            submit_button.click(
                rag,
                inputs=[chatbot, user_input],
                outputs=[chatbot, user_input]
            )

# Use api_name=None to avoid API generation issues
demo.launch()