"""
title: Smart Model Router (Expert, Standard & Übersetzer)
author: Ingmar Stapel
author_url: https://ai-box.eu/
version: 1.5
"""

from pydantic import BaseModel, Field
from typing import Optional, Dict, Any


class Filter:
    class Valves(BaseModel):
        # Konfiguration der Modell-IDs (IDs müssen exakt wie in Open WebUI angezeigt lauten)
        model_20b: str = Field(
            default="gpt-oss:20b",
            description="Standard-Modell für einfache Anfragen",
        )
        model_120b: str = Field(
            default="gpt-oss:120b",
            description="Experten-Modell für komplexe Aufgaben",
        )
        model_translate: str = Field(
            default="translategemma:27b",
            description="Spezialisiertes Modell für Übersetzungen",
        )

        # Entscheidungs-Logik Keywords
        complex_keywords: str = Field(
            default="programmieren,logik,mathe,analyse,beweise,zusammenfassung",
            description="Keywords (kommagetrennt), die das Experten-Modell aktivieren",
        )
        translate_keywords: str = Field(
            default="übersetze,übersetzung,translation,translate",
            description="Keywords (kommagetrennt), die das Übersetzungs-Modell aktivieren",
        )

        # Anzeige-Optionen
        show_model_info: bool = Field(
            default=True,
            description="Blendet am Ende der Antwort ein, welches Modell im Hintergrund genutzt wurde.",
        )

    def __init__(self):
        self.valves = self.Valves()
        self.last_used_model_name = "Unbekannt"

    def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
        """Wird vor dem Senden an das LLM ausgeführt."""
        try:
            messages = body.get("messages", [])
            if not messages:
                return body

            # Letzte Nachricht des Benutzers extrahieren
            last_message_content = messages[-1].get("content", "").lower()

            # Keyword-Listen aus den Valves generieren
            complex_kw = [
                k.strip().lower() for k in self.valves.complex_keywords.split(",")
            ]
            translate_kw = [
                k.strip().lower() for k in self.valves.translate_keywords.split(",")
            ]

            # --- ROUTING LOGIK ---

            # 1. Priorität: Übersetzungsspezialist
            if any(keyword in last_message_content for keyword in translate_kw):
                target_model = self.valves.model_translate
                self.last_used_model_name = "Übersetzer-Spezialist (translategemma:27b)"

            # 2. Priorität: Experten-Modell (Keywords oder Textlänge > 300 Zeichen)
            elif (
                any(keyword in last_message_content for keyword in complex_kw)
                or len(last_message_content) > 300
            ):
                target_model = self.valves.model_120b
                self.last_used_model_name = "Experte (120B Modell)"

            # 3. Standard: Das reguläre Arbeitsmodell
            else:
                target_model = self.valves.model_20b
                self.last_used_model_name = "Standard (20B Modell)"

            # Das gewählte Modell im Request-Body überschreiben
            body["model"] = target_model

            # Debug-Ausgabe in der Docker-Konsole (docker logs -f open-webui)
            print(f"Smart-Router aktiv: Leite Anfrage an {target_model} weiter.")

        except Exception as e:
            print(f"Fehler im Smart-Router Inlet: {e}")

        return body

    def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
        """Wird nach der Generierung durch das LLM ausgeführt."""
        try:
            if not self.valves.show_model_info:
                return body

            # Hinweis an die Antwort hängen, damit der Nutzer das Routing bemerkt
            if "messages" in body and len(body["messages"]) > 0:
                # Wir prüfen, ob es sich um eine gültige Antwort handelt
                if "content" in body["messages"][-1]:
                    info_tag = f"\n\n--- \n*Souveräne KI-Infrastruktur: Antwort automatisch generiert von **{self.last_used_model_name}***"
                    body["messages"][-1]["content"] += info_tag
        except Exception as e:
            print(f"Fehler im Smart-Router Outlet: {e}")

        return body
