import streamlit as st
from openai import OpenAI
import time
import os
import pandas as pd
import datetime
from huggingface_hub import HfApi, upload_file
# Environment variables
generated_user = os.getenv("User")
generated_password = os.getenv("Password")
openai_key = os.getenv("openai_key")
assistant_id = os.getenv("ASSISTANT_ID")
hf_token = os.getenv("HF_TOKEN")
transcript_file = "transcripts.xlsx"
st.set_page_config(page_title="Carfind.co.za AI Assistant", layout="wide")
st.markdown("
🚗 Carfind.co.za AI Assistant
", unsafe_allow_html=True)
st.caption("Chat with Carfind.co.za and find your next car fast")
st.markdown("""
    
""", unsafe_allow_html=True)
# Save chat to Excel and push to Hugging Face repo
def append_to_transcript(thread_id, role, message):
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    new_entry = {
        "Timestamp": timestamp,
        "Thread_ID": thread_id,
        "Role": role,
        "Message": message
    }
    try:
        if os.path.exists(transcript_file):
            df = pd.read_excel(transcript_file)
            df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True)
        else:
            df = pd.DataFrame([new_entry])
        df.to_excel(transcript_file, index=False)
        
        # Upload updated transcripts.xlsx to Hugging Face
        api = HfApi(token=hf_token)
        upload_file(
            path_or_fileobj=transcript_file,
            path_in_repo="transcripts.xlsx",
            repo_id="IAMTFRMZA/cfaiassistant",
            repo_type="space",
            token=hf_token,
            commit_message=f"Transcript update {timestamp}"
        )
    except Exception as e:
        st.error(f"Transcript logging failed: {str(e)}")
# Authentication
if "authenticated" not in st.session_state:
    st.session_state.authenticated = False
if not st.session_state.authenticated:
    st.subheader("🔑 Login")
    username = st.text_input("Username")
    password = st.text_input("Password", type="password")
    if username and password:
        if username == generated_user and password == generated_password:
            st.session_state.authenticated = True
            st.success("Login successful! Redirecting...")
            time.sleep(1)
            st.rerun()
        else:
            st.error("Incorrect username or password.")
else:
    st.divider()
    if "thread_id" not in st.session_state:
        st.session_state["thread_id"] = None
    input_col, clear_col = st.columns([8, 1])
    with input_col:
        user_input = st.text_input("Type your message here...", key="chat_input")
    with clear_col:
        if st.button("🗑️", help="Clear Chat"):
            st.session_state["thread_id"] = None
            st.success("Chat cleared.")
            st.rerun()
    if openai_key and assistant_id and hf_token:
        client = OpenAI(api_key=openai_key)
        if user_input:
            if not st.session_state["thread_id"]:
                thread = client.beta.threads.create()
                st.session_state["thread_id"] = thread.id
            # Add user message and log
            client.beta.threads.messages.create(
                thread_id=st.session_state["thread_id"], role="user", content=user_input
            )
            append_to_transcript(st.session_state["thread_id"], "user", user_input)
            try:
                with st.spinner("Thinking and typing... 💭"):
                    run = client.beta.threads.runs.create(
                        thread_id=st.session_state["thread_id"], assistant_id=assistant_id
                    )
                    while True:
                        run_status = client.beta.threads.runs.retrieve(
                            thread_id=st.session_state["thread_id"], run_id=run.id
                        )
                        if run_status.status == "completed":
                            break
                        time.sleep(1)
                messages_response = client.beta.threads.messages.list(
                    thread_id=st.session_state["thread_id"]
                )
                assistant_icon_html = " "
                # Display chat conversation
                for msg in reversed(messages_response.data):
                    if msg.role == "user":
                        st.markdown(
                            f"
"
                # Display chat conversation
                for msg in reversed(messages_response.data):
                    if msg.role == "user":
                        st.markdown(
                            f""
                            f"👤 You: {msg.content[0].text.value}"
                            f"
", unsafe_allow_html=True
                        )
                    else:
                        response_text = msg.content[0].text.value
                        append_to_transcript(st.session_state["thread_id"], "assistant", response_text)
                        st.markdown(
                            f""
                            f"{assistant_icon_html} Carfind Assistant: {response_text}"
                            f"
", unsafe_allow_html=True
                        )
            except Exception as e:
                st.error(f"An error occurred: {str(e)}")
    else:
        st.error("⚠️ Missing OpenAI key, Assistant ID or HF token. Please check Hugging Face secrets.")