# rag_service.py
import os
import re
LOG_RAG = True
from openai import OpenAI
from rag_db import query_rag_context_from_db, build_rag_augmented_prompt

OPENAI_MODEL = "gpt-4o-mini"

# 🔧 NEU: Systemprompt, der den Realcube-Mehrwert *verbindlich* macht
RAG_SYSTEM = """Du bist ein präziser, faktenorientierter Assistent.
Nutze – wenn passend – den bereitgestellten Kontext aus den Realcube-Dokumenten.
Wenn der Kontext nicht passt, antworte ohne ihn zu zitieren.
Halte die Antwort fachlich, klar und kompakt (deutsch).

Antworte IMMER in diesem Format:
1) Stelle die Kernpunkte der Realcube Leistungen im Kontext in <3–5 Bulletpoints> dar. Liste einfach die Bulletpoints ohne Einleitung oder Überschrift. Alle Bulletpoints bitte in einzelnen Zeilen und nicht fettgedruckt.
2) REALCUBE-Mehrwert: Beginne mit „Mit der Realcube-Plattform …“ und erläutere in 1–2 Sätzen, was dadurch möglich wird, was sonst nicht möglich wäre (auch wenn kein Kontext genutzt wurde).
3) Erwähne, dass die Realcube Plattform KI verwendet, wenn der Use-Case passt und erkläre fallabhängig wie die Ergebnisse dadurch verbessert werden können. 
"""

LATEX_RE = re.compile(
    r"\$\$[\s\S]*?\$\$"      # $$…$$
    r"|\\\[[\s\S]*?\\\]"     # \[…\]
    r"|\\\([\s\S]*?\\\)"     # \(...\)
    r"|\$[^$\n]*\$"          # $…$
, re.S)

def strip_latex(s: str) -> str:
    return LATEX_RE.sub("", s).replace("  ", " ").strip()


def generate_rag_addendum(user_query: str, tenant_id: int, top_k: int = 3) -> dict:
    res = query_rag_context_from_db(user_query, tenant_id=tenant_id, top_k=top_k)
    context = res.get("context") or ""
    matches = res.get("matches", [])

    if LOG_RAG:
        print(f"🧩 RAG: matches={len(matches)} top_k={top_k} tenant={tenant_id}", flush=True)
        for m in matches[:5]:
            print(f"   · [{m['rank']}] {m['title']}  sim={m['similarity']:.3f}", flush=True)
        print("🧩 RAG context preview:\n" + (context[:1200] or "(empty)"), flush=True)

    if not context.strip():
        # Auch ohne Kontext wollen wir weiterhin den Realcube-Mehrwert im Output
        # → trotzdem Systemprompt verwenden, aber prompt = Frage ohne KONTEXT
        prompt = build_rag_augmented_prompt(user_query, "")  # ok, falls deine Funktion damit umgehen kann
    else:
        prompt = build_rag_augmented_prompt(user_query, context)

    if LOG_RAG:
        print("🧩 RAG prompt >>>", flush=True)
        print(prompt, flush=True)
        print("<<< END RAG prompt", flush=True)
        print("🧩 RAG system >>>", flush=True)
        print(RAG_SYSTEM.splitlines()[0] + " …", flush=True)

    client = OpenAI()
    chat = client.chat.completions.create(
        model=OPENAI_MODEL,
        temperature=0.2,
        messages=[
            {"role": "system", "content": RAG_SYSTEM},      # ✅ System hat Vorrang
            {"role": "user", "content": prompt},            # ✅ dein bestehender Prompt als user
        ],
    )
    addendum = (chat.choices[0].message.content or "").strip()

    # (Optional) Fallback-Guard: Stelle sicher, dass „REALCUBE-Mehrwert:“ enthalten ist
    if "REALCUBE-Mehrwert" not in addendum:
        addendum += (
            "\n\nREALCUBE-Mehrwert: Mit der Realcube-Plattform werden Quell- und "
            "Zieldaten aus heterogenen Systemen konsolidiert, laufend aktualisiert "
            "und KI-auswertbar gemacht – Analysen und Prognosen lassen sich damit "
            "in Qualität und Taktung erreichen, die sonst in dieser Form nicht möglich wären."
        )

    return {"context": context, "matches": matches, "addendum": addendum}
