import os
import json
import requests
import streamlit as st
from PyPDF2 import PdfReader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from duckduckgo_search import DDGS
import csv
from datetime import datetime

def save_feedback(query, answer, score):
    file_exists = os.path.isfile('feedback_logs.csv')
    with open('feedback_logs.csv', mode='a', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        if not file_exists:
            writer.writerow(['Timestamp', 'Query', 'Answer', 'Score'])
        writer.writerow([datetime.now(), query, answer, score])

def log_interaction(query, answer):
    file_exists = os.path.isfile('chat_logs.csv')
    with open('chat_logs.csv', mode='a', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        if not file_exists:
            writer.writerow(['Timestamp', 'Query', 'Answer'])
        writer.writerow([datetime.now(), query, answer])

# --- 1. ΡΥΘΜΙΣΕΙΣ ΣΕΛΙΔΑΣ ---
st.set_page_config(page_title="ΕΚΠΑ Erasmus Bot", page_icon="🌍")

GOOGLE_API_KEY = st.secrets["GOOGLE_API_KEY"]

# --- 2. ΣΥΣΤΗΜΑ CACHE ΓΙΑ PDF ---
@st.cache_resource(show_spinner="Διάβασμα αρχείων και προετοιμασία βάσης... (Μόνο 1η φορά)")
def setup_knowledge_base():
    texts = []
    metadatas = [] 
    
    files = [f for f in os.listdir('.') if f.endswith('.pdf')]
    for file in files:
        reader = PdfReader(file)
        file_text = ""
        for page in reader.pages:
            content = page.extract_text()
            if content: file_text += content
            
        texts.append(file_text)
        metadatas.append({"filename": file})
            
    splitter = RecursiveCharacterTextSplitter(chunk_size=2500, chunk_overlap=1000)
    chunks = splitter.create_documents(texts, metadatas=metadatas)
    
    embeddings = HuggingFaceEmbeddings(model_name="paraphrase-multilingual-MiniLM-L12-v2")
    vector_store = FAISS.from_documents(chunks, embedding=embeddings)
    return vector_store

vector_store = setup_knowledge_base()

# --- 3. ΓΡΑΦΙΚΟ ΠΕΡΙΒΑΛΛΟΝ (UI) ---
st.markdown(
    """
    <h1 style='font-size: 3rem; margin-bottom:0;'>
        Ψηφιακός Βοηθός 
        <a href='https://www.interel.uoa.gr/erasmus' target='_blank' style='text-decoration: none; color: #0047AB;'>ERASMUS+</a>
    </h1>
    """,
    unsafe_allow_html=True
)
st.markdown(
    "<p style='color: gray; margin-top:0;'>Ο προσωπικός σου assistant στο ταξίδι του Erasmus+</p>",
    unsafe_allow_html=True
)

st.markdown("Καλώς ήρθατε! Ρωτήστε με οτιδήποτε για τη διαδικασία, τα δικαιολογητικά και τις προϋποθέσεις κινητικότητας.")
st.divider()

with st.sidebar:
    st.markdown(
        """
        <div style="display: flex; justify-content: center;">
            <a href="https://www.uoa.gr/" target="_blank">
                <img src="https://www.uoa.gr/fileadmin/user_upload/uoa_logo_gr.svg" width="220">
            </a>
        </div>
        """, 
        unsafe_allow_html=True
    )
    st.divider()
    st.header("📌 Οδηγίες Χρήσης")
    st.info("""
    Αυτό το Chatbot χρησιμοποιεί Τεχνητή Νοημοσύνη για να διαβάζει τα επίσημα έγγραφα του ΕΚΠΑ.
    
    **Δοκιμάστε να ρωτήσετε:**
    - *Τι δικαιολογητικά χρειάζομαι για τη μακροχρόνια μετακίνηση;*
    - *Ποια είναι η διαδικασία για βραχυχρόνια κινητικότητα;*
    - *Τι έγγραφα χρειάζομαι για επιμόρφωση προσωπικού;*
    """)
    st.divider()
    st.caption("Δημιουργήθηκε στο πλαίσιο διπλωματικής εργασίας.") 
    st.markdown(
        """
        <div style="display: flex; justify-content: center;">
            <a href="https://www.digital-marketing.edu.gr/index.php/category/announcements/" target="_blank">
                <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSszK2dtO38xWcoAIktkEMTUa72N2wzysQ59A&s" width="120">
            </a>
        </div>
        """, 
        unsafe_allow_html=True
    )
    st.divider()

if "messages" not in st.session_state:
    st.session_state.messages = []

for i, message in enumerate(st.session_state.messages):
    icon = "🎓" if message["role"] == "user" else "🦉"
    with st.chat_message(message["role"], avatar=icon):
        st.markdown(message["content"])
        if message["role"] == "assistant":
            feedback_key = f"feedback_{i}"
            feedback_val = st.feedback("thumbs", key=feedback_key)
            if feedback_val is not None and not message.get("feedback_saved"):
                prev_query = st.session_state.messages[i-1]["content"]
                save_feedback(prev_query, message["content"], feedback_val)
                st.toast("Ευχαριστούμε για την αξιολόγηση!")
                st.session_state.messages[i]["feedback_saved"] = True

# --- 4. ΚΟΥΤΙ ΕΙΣΑΓΩΓΗΣ & ΣΥΝΟΜΙΛΙΑ ---
st.markdown("💡 **Γρήγορες Ερωτήσεις:**")
col1, col2, col3 = st.columns(3)

pressed_button = None
if col1.button("📄 Δικαιολογητικά"):
    pressed_button = "Τι δικαιολογητικά χρειάζομαι για την αίτηση;"
if col2.button("🌍 Πανεπιστήμια"):
    pressed_button = "Πού θα βρω τον πίνακα με τις διμερείς συμφωνίες;"
if col3.button("💰 Οικονομικά"):
    pressed_button = "Τι ισχύει για την επιχορήγηση;"

user_input = st.chat_input("Γράψε την ερώτησή σου για το Erasmus...")
query = pressed_button or user_input

if query:
    with st.chat_message("user", avatar="🎓"):
        st.markdown(query)
    st.session_state.messages.append({"role": "user", "content": query})

    with st.chat_message("assistant", avatar="🦉"):
        with st.spinner("Αναζήτηση στη βάση δεδομένων μου..."):
            
            # 1. ΕΞΥΠΝΗ ΜΝΗΜΗ ΓΙΑ ΤΟ SEARCH (Contextual Query)
            full_context_query = query
            if len(query.split()) < 8 and len(st.session_state.messages) >= 3:
                last_user_msg = st.session_state.messages[-3]["content"]
                full_context_query = f"{last_user_msg} {query}"

            user_query = full_context_query.lower()
            dynamic_synonyms = ""
            
            # 2. INTENT DETECTION & KEYWORD EXPANSION
            if any(word in user_query for word in ["λεφτά", "χρήματα", "ποσό", "πληρωμή", "πόσα", "υποτροφία", "πράσινη μετακίνηση", "ημέρα", "ημερα", "δαπάνες", "δαπανες"]):
                dynamic_synonyms += " επιχορήγηση υποτροφία ποσό χρηματοδότηση δόσεις ατομικές δαπάνες ημερήσια αποζημίωση ομάδες χωρών"
                
            if any(word in user_query for word in ["χαρτιά", "έγγραφα", "δικαιολογητικά", "αίτηση", "χρειάζομαι", "που", "πώς", "link", "σύνδεσμος", "πλατφόρμα", "ολοκλήρωση", "επιστροφή"]):
                dynamic_synonyms += " δικαιολογητικά έντυπα έγγραφα βεβαίωση ηλεκτρονική αίτηση σύνδεσμος link url υποβολή πλατφόρμα online μετά την επιστροφή"
                
            if any(word in user_query for word in ["πανεπιστήμια", "πού", "λίστα", "χώρες", "ιδρύματα", "συμφωνίες"]):
                dynamic_synonyms += " διμερείς συμφωνίες πίνακας συνεργαζόμενων excel λίστα"
            
            if any(word in user_query for word in ["ευκαιρίες", "ευπαθείς", "αμεα", "αναπηρία", "οικονομικά ασθενείς", "προσαύξηση"]):
                dynamic_synonyms += " άτομα με λιγότερες ευκαιρίες προσαύξηση επιχορήγηση κριτήρια"    
            
            if any(word in user_query for word in ["τι είναι", "τι σημαίνει", "ορισμός", "σκοπός", "τι αφορά", "γενικά"]):
                dynamic_synonyms += " ορισμός σκοπός πρόγραμμα δράση βασική δράση πλαίσιο"

            # Διαχωρισμός νέων κατηγοριών προσωπικού (STA / STT )
            if any(word in user_query for word in ["διδασκαλία", "καθηγητές", "sta", "teaching"]):
                dynamic_synonyms += " sta staff mobility for teaching προσωπικό διδασκαλία έργο"
            if any(word in user_query for word in ["επιμόρφωση", "διοικητικό", "stt", "training", "σεμινάριο"]):
                dynamic_synonyms += " stt staff training συνολικό προσωπικό επιμόρφωση σεμινάριο"

            # Διαχωρισμός νέων κατηγοριών φοιτητών (Long / Short Term)
            if any(word in user_query for word in ["μακροχρόνια", "long", "εξάμηνο", "έτος"]):
                dynamic_synonyms += " sms out long term μακροχρόνια κινητικότητα σπουδές"
            if any(word in user_query for word in ["βραχυχρόνια", "short", "bip", "εντατικό", "blended"]):
                dynamic_synonyms += " sms out short term βραχυχρόνια κινητικότητα blended short-term εντατικό"

            # --- ΕΞΥΠΝΟΙ ΣΥΝΔΥΑΣΜΟΙ (COMBOS) ΓΙΑ ΔΙΚΑΙΟΛΟΓΗΤΙΚΑ ΑΝΑ ΤΥΠΟ ---
            has_docs_intent = any(w in user_query for w in ["δικαιολογητικά", "έγγραφα", "χαρτιά", "αίτηση", "ολοκλήρωση", "επιστροφή"])
            
            if has_docs_intent:
                if any(w in user_query for w in ["μακροχρόνια", "long"]):
                    dynamic_synonyms += " στάδιο α στάδιο β στάδιο γ πριν την αναχώρηση κατά τη διάρκεια μετά την επιστροφή learning agreement transcript of records"
                if any(w in user_query for w in ["βραχυχρόνια", "short", "bip"]):
                    dynamic_synonyms += " βραχυχρόνια δικαιολογητικά blended mobility confirmation letter"
                if any(w in user_query for w in ["διδασκαλία", "καθηγητές", "sta"]):
                    dynamic_synonyms += " α φάση β φάση mobility agreement για διδασκαλία πρόγραμμα εργασίας πρόσκληση"
                if any(w in user_query for w in ["επιμόρφωση", "διοικητικό", "stt"]):
                    dynamic_synonyms += " α φάση β φάση mobility agreement για επιμόρφωση πρόγραμμα εργασίας"

            # --- ΑΝΙΧΝΕΥΣΗ ΔΥΣΑΡΕΣΚΕΙΑΣ / ΕΠΙΚΟΙΝΩΝΙΑΣ ---
            escalation_flag = False
            escalation_keywords = [
                "δεν καταλαβαίνεις", "λάθος", "χάλια", "άνθρωπο", "ανθρωπο", 
                "υπάλληλο", "υπαλληλο", "τηλέφωνο", "τηλεφωνο", "επικοινωνία", 
                "επικοινωνια", "δεν βοηθάς", "δεν βοηθας", "δεν με βοηθάς", 
                "δεν με βοηθας", "εκνευρισμός"
            ]
            if any(word in user_query for word in escalation_keywords):
                escalation_flag = True

            if not dynamic_synonyms: 
                dynamic_synonyms = " erasmus εκπα κινητικότητα"

            smart_query = f"{full_context_query} {dynamic_synonyms}"
            
            # --- ADVANCED RAG: Μεγάλο "Δίχτυ" Αναζήτησης (Απλή Ομοιότητα) ---
            docs = vector_store.similarity_search(smart_query, k=60)
            
            # --- ADVANCED RAG: GRANULAR METADATA INJECTION ---
            context_list = []
            for doc in docs:
                filename = doc.metadata.get("filename", "").upper()
                
                # --- Ο "ΠΟΡΤΙΕΡΗΣ" (HARD FILTER) ΑΝΑΒΑΘΜΙΣΜΕΝΟΣ ---
                is_stt = any(w in user_query for w in ["stt", "επιμόρφωση", "διοικητικό"])
                is_sta = any(w in user_query for w in ["sta", "διδασκαλία", "διδασκαλια", "καθηγητές"])
                is_sms = any(w in user_query for w in ["sms", "μακροχρόνια", "βραχυχρόνια", "φοιτητ"])

                # Προστασία: Εφαρμόζει το φίλτρο αποκλεισμού ΜΟΝΟ αν ο χρήστης ζητάει ξεκάθαρα 1 κατηγορία.
                if is_stt and not (is_sta or is_sms):
                    if any(x in filename for x in ["SMS", "STA"]): continue
                elif is_sta and not (is_stt or is_sms):
                    if any(x in filename for x in ["SMS", "STT"]): continue
                elif is_sms and not (is_sta or is_stt):
                    if any(x in filename for x in ["STA", "STT"]): continue

                prefix = ""
                
                # 1. Βρίσκουμε τον Τύπο Κινητικότητας
                if "SMS_OUT_LONG_TERM" in filename or "SMS_LONG" in filename: prefix += "[ΚΑΤΗΓΟΡΙΑ: ΜΑΚΡΟΧΡΟΝΙΑ ΦΟΙΤΗΤΩΝ] "
                elif "SMS_OUT_SHORT_TERM" in filename: prefix += "[ΚΑΤΗΓΟΡΙΑ: ΒΡΑΧΥΧΡΟΝΙΑ ΦΟΙΤΗΤΩΝ] "
                elif "STA_OUT" in filename or "STA" in filename: prefix += "[ΚΑΤΗΓΟΡΙΑ: ΠΡΟΣΩΠΙΚΟ ΔΙΔΑΣΚΑΛΙΑ STA] "
                elif "STT_OUT" in filename or "STT" in filename: prefix += "[ΚΑΤΗΓΟΡΙΑ: ΠΡΟΣΩΠΙΚΟ ΕΠΙΜΟΡΦΩΣΗ STT] "
                
                # 2. Βρίσκουμε το Θέμα
                if "EPIXORIGISI" in filename: prefix += "- [ΘΕΜΑ: ΟΙΚΟΝΟΜΙΚΑ ΚΑΙ ΕΠΙΧΟΡΗΓΗΣΗ]\n"
                elif "DIKAIOLOGITIKA" in filename: prefix += "- [ΘΕΜΑ: ΔΙΚΑΙΟΛΟΓΗΤΙΚΑ / ΑΙΤΗΣΗ]\n"
                elif "OLOKLIROSI" in filename: prefix += "- [ΘΕΜΑ: ΔΙΚΑΙΟΛΟΓΗΤΙΚΑ ΕΠΙΣΤΡΟΦΗΣ / ΟΛΟΚΛΗΡΩΣΗ]\n"
                elif "LEARNING_AGREEMENT" in filename: prefix += "- [ΘΕΜΑ: ΕΠΙΛΟΓΗ ΜΑΘΗΜΑΤΩΝ ΚΑΙ LEARNING AGREEMENT]\n"
                elif "ASFALISI_VISA" in filename: prefix += "- [ΘΕΜΑ: ΑΣΦΑΛΙΣΗ ΕΚΑΑ, ΥΓΕΙΑ ΚΑΙ VISA]\n"
                elif "YPOXREOSEIS" in filename: prefix += "- [ΘΕΜΑ: ΑΠΟΤΥΧΙΑ ΣΕ ΜΑΘΗΜΑΤΑ / ΑΚΑΔΗΜΑΪΚΕΣ ΥΠΟΧΡΕΩΣΕΙΣ]\n"
                elif "EPILOGI" in filename: prefix += "- [ΘΕΜΑ: ΚΡΙΤΗΡΙΑ ΕΠΙΛΟΓΗΣ ΚΑΙ ΜΟΡΙΟΔΟΤΗΣΗ]\n"
                elif "YPODOXI_STEGASI" in filename: prefix += "- [ΘΕΜΑ: ΠΑΝΕΠΙΣΤΗΜΙΟ ΥΠΟΔΟΧΗΣ ΚΑΙ ΣΤΕΓΑΣΗ]\n"
                else: prefix += "- [ΘΕΜΑ: ΓΕΝΙΚΕΣ ΠΛΗΡΟΦΟΡΙΕΣ]\n"
                    
                context_list.append(prefix + doc.page_content)
                
                # Κλείδωμα στα 12 πιο σχετικά αρχεία
                if len(context_list) >= 12:
                    break
                
            context = "\n\n".join(context_list)
            with st.expander("👁️ Τι βρήκε η αναζήτηση στα PDF (Debug)"):
                st.write(context)
            
            # --- ΔΥΝΑΜΙΚΗ ΣΥΣΤΑΣΗ (Dynamic Intro) ---
            if len(st.session_state.messages) <= 1:
                intro_instruction = "Ξεκίνα την απάντησή σου συστήνοντας τον εαυτό σου ευγενικά ως ErasBot. (ΣΗΜΑΝΤΙΚΟ: Το καλωσόρισμα πρέπει να μεταφραστεί στη γλώσσα του χρήστη)."
            else:
                intro_instruction = "ΜΗΝ συστηθείς ξανά. Απάντησε κατευθείαν στην ερώτηση."
               
            # --- ΕΝΤΟΛΗ ΠΑΡΑΠΟΜΠΗΣ ΣΕ ΥΠΑΛΛΗΛΟ ---
            escalation_instruction = ""
            if escalation_flag:
                escalation_instruction = """
                ============= ΑΠΟΛΥΤΗ ΠΡΟΤΕΡΑΙΟΤΗΤΑ (OVERRIDE) =============
                Ο χρήστης είναι δυσαρεστημένος, δεν βρίσκει αυτό που θέλει, ή ζητάει τηλέφωνο/επικοινωνία. 
                ΑΓΝΟΗΣΕ ΟΛΑ ΤΑ ΠΑΡΑΚΑΤΩ ΚΕΙΜΕΝΑ ΚΑΙ ΤΟΥΣ ΚΑΝΟΝΕΣ ΔΙΑΛΟΓΗΣ. 
                Ζήτα ευγενικά και με ενσυναίσθηση συγγνώμη ΣΤΗ ΓΛΩΣΣΑ ΤΟΥ ΧΡΗΣΤΗ εξηγώντας ότι ως ψηφιακός βοηθός ίσως δεν μπορείς να καλύψεις την περίπτωσή του.
                Δώσε ΑΚΡΙΒΩΣ αυτά τα στοιχεία επικοινωνίας και ΤΕΡΜΑΤΙΣΕ ΤΗΝ ΑΠΑΝΤΗΣΗ ΕΚΕΙ:
                📞 Τηλέφωνο: 210-3689728
                📧 Email: erasmus@uoa.gr
                ===========================================================
                """
            
            # Το Αναβαθμισμένο Super-Prompt
            prompt = f"""
            Είσαι ο επίσημος, ευγενικός ψηφιακός βοηθός του Γραφείου Erasmus του ΕΚΠΑ (ErasBot).
            
            {intro_instruction}
            {escalation_instruction}
            
            ΚΡΙΣΙΜΟΣ ΚΑΝΟΝΑΣ ΔΙΑΛΟΓΗΣ (ROUTING GUARDRAIL): 
            Στις ΠΛΗΡΟΦΟΡΙΕΣ υπάρχουν δεδομένα για 4 διαφορετικούς τύπους κινητικότητας:
            1. Μακροχρόνια Κινητικότητα Φοιτητών (SMS Long-Term)
            2. Βραχυχρόνια Κινητικότητα Φοιτητών (SMS Short-Term)
            3. Κινητικότητα Προσωπικού για Διδασκαλία (STA)
            4. Κινητικότητα Προσωπικού για Επιμόρφωση (STT)
            
            - Αν η ερώτηση είναι αμιγώς ΕΓΚΥΚΛΟΠΑΙΔΙΚΗ ή ΟΡΙΣΜΟΣ (π.χ. "τι είναι το Erasmus", "ποιος είναι ο σκοπός"), απάντησε ΑΠΕΥΘΕΙΑΣ βασιζόμενος στις γενικές πληροφορίες των εγγράφων, χωρίς να ρωτήσεις κατηγορία.
            - Αν η ερώτηση είναι ΔΙΑΔΙΚΑΣΤΙΚΗ (π.χ. "πού κάνω αίτηση", "τι δικαιολογητικά χρειάζομαι", "επιχορήγηση") και ο χρήστης ΔΕΝ έχει ξεκαθαρίσει σε ποιον από τους 4 τύπους αναφέρεται, ΠΡΕΠΕΙ ΥΠΟΧΡΕΩΤΙΚΑ ΝΑ ΣΤΑΜΑΤΗΣΕΙΣ ΚΑΙ ΝΑ ΖΗΤΗΣΕΙΣ ΔΙΕΥΚΡΙΝΙΣΗ (στη γλώσσα του χρήστη) παραθέτοντας τις 4 επιλογές με κατανοητό τρόπο.
            - [ΕΙΔΙΚΟΣ ΚΑΝΟΝΑΣ ΣΤΑΔΙΩΝ]: Αν ο τύπος κινητικότητας είναι σαφής, αλλά η ερώτηση αφορά γενικά "ΔΙΚΑΙΟΛΟΓΗΤΙΚΑ" χωρίς να προσδιορίζεται η φάση, ΠΡΕΠΕΙ ΝΑ ΣΤΑΜΑΤΗΣΕΙΣ ΚΑΙ ΝΑ ΡΩΤΗΣΕΙΣ (στη γλώσσα του χρήστη) για ποιο στάδιο επιθυμεί τα έγγραφα (π.χ. Στάδιο Α: Πριν την αναχώρηση, Στάδιο Β: Κατά τη διάρκεια, Στάδιο Γ: Μετά την επιστροφή/Ολοκλήρωση).
            
            ΟΔΗΓΙΕΣ:
            1. Απάντησε ΣΥΝΤΟΜΑ και ΠΕΡΙΕΚΤΙΚΑ. Περιορίσου ΑΥΣΤΗΡΑ στην ερώτηση του χρήστη. ΑΠΑΓΟΡΕΥΕΤΑΙ να δίνεις πληροφορίες που δεν ζητήθηκαν (π.χ. μην αναφέρεις δικαιολογητικά επιστροφής αν ο χρήστης ρωτάει απλώς για το αρχικό στάδιο).
            2. Χρησιμοποίησε ΜΟΝΟ τις παρακάτω ΠΛΗΡΟΦΟΡΙΕΣ για να συνθέσεις την απάντησή σου.
            3. Αν η απάντηση δεν υπάρχει στο κείμενο, ενημέρωσε τον χρήστη ότι δεν βρήκες σχετική αναφορά στα αρχεία σου.
            4. Χώρισε την απάντησή σου σε λίστες (bullets) για να είναι ευανάγνωστη.
            5. Αν στο κείμενο υπάρχει σύνδεσμος (URL), γράψε τον ολόκληρο.
            6. ΠΡΟΣΟΧΗ ΣΤΙΣ ΛΙΣΤΕΣ: Όταν η ερώτηση ΑΦΟΡΑ ρητά δικαιολογητικά για μια συγκεκριμένη φάση, ΠΡΕΠΕΙ να τα παραθέτεις ΟΛΑ όσα βρίσκεις στο κείμενο, χωρίς να παραλείπεις κανένα.
            
            ΠΛΗΡΟΦΟΡΙΕΣ:
            {context}
            
            ====================
            ΑΥΣΤΗΡΟΣ ΚΑΝΟΝΑΣ ΓΛΩΣΣΑΣ: 
            Απάντησε ΣΤΗΝ ΚΥΡΙΑ ΓΛΩΣΣΑ της συνομιλίας.
            - Αν ο χρήστης ρωτάει ξεκάθαρα με ολόκληρη πρόταση στα Αγγλικά (π.χ. "What documents do I need for STA?"), απάντησε αποκλειστικά στα Αγγλικά.
            - Αν ο χρήστης ρωτάει στα Ελληνικά αλλά χρησιμοποιεί αγγλικούς όρους (π.χ. "τι είναι το SMS;", "πληροφορίες για το long term grant"), ή αν απαντάει μονολεκτικά με ακρωνύμια (π.χ. "SMS", "STT", "STA") ενώ η συζήτηση είναι στα Ελληνικά, ΠΡΕΠΕΙ ΥΠΟΧΡΕΩΤΙΚΑ να απαντήσεις στα ΕΛΛΗΝΙΚΑ.
            ====================
            
            ΕΡΩΤΗΣΗ: {full_context_query}
            """
             
            # --- ADVANCED RAG: CONVERSATION MEMORY ---
            gemini_history = []
            for msg in st.session_state.messages[:-1]:
                role = "user" if msg["role"] == "user" else "model"
                gemini_history.append({
                    "role": role,
                    "parts": [{"text": msg["content"]}]
                })
            
            gemini_history.append({
                "role": "user",
                "parts": [{"text": prompt}]
            })

            url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key={GOOGLE_API_KEY}"
            headers = {'Content-Type': 'application/json'}
            data = {
                "contents": gemini_history,
                "generationConfig": {"temperature": 0.3}
            }
            
            try:
                response = requests.post(url, headers=headers, data=json.dumps(data))
                result = response.json()
                
                if "candidates" in result:
                    answer = result["candidates"][0]["content"]["parts"][0]["text"]
                    
                    # --- ΕΦΕΔΡΙΚΗ ΑΝΑΖΗΤΗΣΗ ΣΤΟ WEB (FALLBACK) ---
                    if any(phrase in answer.lower() for phrase in ["δεν βρήκα", "δεν αναφέρεται", "δεν βρέθηκε", "i could not find", "i cannot find", "i'm sorry", "λυπάμαι"]):
                        with st.status("🔍 Δεν βρέθηκε στα έγγραφα. Γίνεται αναζήτηση στην επίσημη ιστοσελίδα του ERASMUS+ του ΕΚΠΑ...", expanded=True) as status:
                            try:
                                # Καθαρίζουμε την ερώτηση για να βοηθήσουμε το DuckDuckGo
                                clean_query = full_context_query.replace("?", "").replace("εχεις το", "")
                                search_query = f"site:interel.uoa.gr/erasmus {clean_query}"
                                web_snippets = []
                                
                                with DDGS() as ddgs:
                                    results = ddgs.text(search_query, max_results=3, backend='lite')
                                    if results:
                                        for r in results:
                                            web_snippets.append(f"Πηγή (Link): {r['href']}\nΠληροφορία: {r['body']}")
                                
                                web_context = "\n\n".join(web_snippets)
                                
                                if web_context:
                                    web_prompt = f"""
                                    Είσαι ο ErasBot. Ο χρήστης ρώτησε κάτι που βρήκαμε στο επίσημο site του ΕΚΠΑ.
                                    Απάντησε στην ερώτηση με βάση ΜΟΝΟ τα παρακάτω δεδομένα αναζήτησης.
                                    ΣΗΜΑΝΤΙΚΟ: Απάντησε ΑΥΣΤΗΡΑ στην ίδια γλώσσα με την ΕΡΩΤΗΣΗ του χρήστη.
                                    Στο τέλος της απάντησής σου, πρόσθεσε τα Links που χρησιμοποίησες ως "Πηγές".
                                    
                                    ΔΕΔΟΜΕΝΑ WEB:
                                    {web_context}
                                    
                                    ΕΡΩΤΗΣΗ ΧΡΗΣΤΗ: {full_context_query}
                                    """
                                    web_data = {"contents": [{"role": "user", "parts": [{"text": web_prompt}]}], "generationConfig": {"temperature": 0.2}}
                                    web_response = requests.post(url, headers=headers, data=json.dumps(web_data)).json()
                                    answer = web_response["candidates"][0]["content"]["parts"][0]["text"]
                                    status.update(label="Βρέθηκε απάντηση στο Internet!", state="complete", expanded=False)
                                else:
                                    answer = "Λυπάμαι, δεν βρήκα σχετική αναφορά ούτε στα αρχεία μου, ούτε στο κεντρικό site (interel.uoa.gr/erasmus)."
                                    status.update(label="Δεν βρέθηκαν αποτελέσματα στο interel.uoa.gr/erasmus.", state="error", expanded=False)
                            except Exception as web_e:
                                status.update(label="Σφάλμα κατά την αναζήτηση στο Internet.", state="error", expanded=False)

                    st.markdown(answer)
                    log_interaction(query, answer)
                    st.session_state.messages.append({"role": "assistant", "content": answer})
                    st.rerun()
                else:
                    st.error(f"Λεπτομέρειες σφάλματος από Google: {result}")
            except Exception as e:
                st.error(f"Σφάλμα σύνδεσης: {e}")