# 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 den bereitgestellten Kontext aus den Realcube RAG Dokumenten.
Halte die Antwort fachlich, klar und kompakt (deutsch).

Antworte IMMER in diesem Format:
1) Stelle die Kernpunkte in <3–5 Bulletpoints> dar.
   - Jeder Bulletpoint muss grammatisch direkt an den folgenden Stamm anschließen:
     „Mit der REALCUBE Plattform steuern und überwachen Sie dazu z.B. Folgendes“
   - Wichtig: Der Stamm-Satz selbst darf nicht erneut ausgegeben oder paraphrasiert werden.
   - Ausgabeformat (streng):
     - Jeder Bulletpoint beginnt mit "- "
     - Nur Nominal- oder Infinitivphrasen (z. B. "- die Optimierung von Cashflows …", "- Risiken frühzeitig erkennen …")
     - Kein Fettdruck, keine Einleitung, keine Überschrift
     - Kein Punkt am Zeilenende (außer bei Abkürzungen)
   - Beispiele (korrekt):
     - die Optimierung von Cashflows zur Sicherung der Zahlungsfähigkeit
     - die Überwachung zinsbedingter Kosteneffekte auf das Portfolio
     - transparente Rendite- und Liquiditätsprognosen für Investoren
   - Beispiele (falsch – vermeiden):
     - Mit der REALCUBE Plattform …  (Stamm wiederholt)
     - Die Optimierung von Cashflows.  (abschließender Punkt)
     - **die Optimierung …**  (fett formatiert)

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) KI-Bezug: 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}
