# app.py

import streamlit as st
import random
import pandas as pd
import time
import speech_recognition as sr
from openai import OpenAI
from PyPDF2 import PdfReader
import langchain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.embeddings import HuggingFaceEmbeddings


# Set DeepSeek API Key

base_url = "https://api.aimlapi.com/v1"
api_key="0f33d8a8b7714460bc4b8335b66d217a"
# Initialize OpenAI client
api = OpenAI(api_key=api_key, base_url=base_url)

# Generate 300 Dummy Messages with Severity Levels
severities = ["High", "Medium", "Low"]
messages = [
    {"message": f"Disaster Alert {i}", "severity": random.choice(severities)}
    for i in range(300)
]
df = pd.DataFrame(messages)

# Streamlit UI
st.set_page_config(page_title="BDRS", layout="wide")

st.title("🌍 BeaconAi Disaster Response System")
st.write("Real-time disaster response with DeepSeek AI-powered chatbot & voice recognition.")

# Live-updating Disaster Message Dashboard
st.subheader("📊 Social Media Monitoring")
chart_placeholder = st.empty()

# Function to Randomly Pick 5 Messages
def get_random_messages():
    return df.sample(5)


# Placeholder for chart
chart_placeholder = st.empty()

# Define severity categories
severities = ["Low", "Medium", "High"]

# Function to update chart
def update_chart():
    selected_messages = get_random_messages()
    severity_counts = selected_messages["severity"].value_counts().reindex(severities, fill_value=0)

    # Create DataFrame
    chart_data = pd.DataFrame({"Severity": severities, "Count": severity_counts.values})

    # Update the chart
    chart_placeholder.bar_chart(chart_data, x="Severity", y="Count", use_container_width=True)

# Auto-refresh every second
st.button("Refresh Data", on_click=st.rerun)

update_chart()



# PDF Processing for Chatbot Context (Pre-Provided PDF)
pdf_path = "Natural Disaster Safety Manual.pdf"  # Ensure this file is in the same directory as app.py

pdf_reader = PdfReader(pdf_path)
raw_text = ""
for page in pdf_reader.pages:
    raw_text += page.extract_text() + "\n"

# Convert to Embeddings for Retrieval
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_text(raw_text)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_db = FAISS.from_texts(texts, embeddings)
retriever = vector_db.as_retriever()

# LangGraph-Powered Q&A System
chat_model = ChatOpenAI(model="deepseek-chat", api_key=api_key, base_url=base_url)
qa = RetrievalQA.from_chain_type(llm=chat_model, chain_type="stuff", retriever=retriever)

# Chatbot UI
st.subheader("🤖 AI-Powered Disaster Chatbot")
user_query = st.text_input("Ask the chatbot:")

if user_query:
    response = qa.run(user_query)
    st.write("**Chatbot Response:**", response)


# Voice Recognition for Non-English Users
st.subheader("🎙️ Voice Recognition (Speech-to-Text)")

if st.button("Start Recording"):
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        st.write("Listening...")
        audio = recognizer.listen(source)

    try:
        recognized_text = recognizer.recognize_google(audio)
        st.write("**Recognized Text:**", recognized_text)
    except sr.UnknownValueError:
        st.write("Sorry, could not understand.")
    except sr.RequestError:
        st.write("Could not request results. Check your internet connection.")

# Disaster Guide Dropdown
st.subheader("🌪️ Disaster Preparedness Guide")

disaster_options = {
    "Wildfire": {
        "steps": [
            "Evacuate if ordered.",
            "Keep emergency supplies ready.",
            "Close all doors and windows."
        ],
        "video": "https://www.youtube.com/watch?v=OCjl6tp8dnw"
    },
    "Earthquake": {
        "steps": [
            "Drop, Cover, and Hold On.",
            "Stay indoors until shaking stops.",
            "Move away from windows."
        ],
        "video": "https://www.youtube.com/watch?v=BLEPakj1YTY"
    },
    "Flood": {
        "steps": [
            "Move to higher ground.",
            "Avoid walking or driving through floodwaters.",
            "Stay tuned to emergency alerts."
        ],
        "video": "https://www.youtube.com/watch?v=43M5mZuzHF8"
    }
}

selected_disaster = st.selectbox("Select a disaster type:", list(disaster_options.keys()))

if selected_disaster:
    st.write("### 🛠 Steps to Follow:")
    for step in disaster_options[selected_disaster]["steps"]:
        st.write(f"- {step}")

    st.write("📺 [Watch Video Guide]({})".format(disaster_options[selected_disaster]["video"]))

st.write("🚀 Stay prepared and stay safe!")