"""
title: Smart Model Router (Expert, Standard & Übersetzer)
author: Ingmar Stapel
author_url: https://ai-box.eu/
version: 3.6
Hinweis: Es muss das Modell llama3.2:latest verfuegbar sein.
"""

from pydantic import BaseModel, Field
from typing import Optional
import requests
import json

class Filter:
    class Valves(BaseModel):
        ollama_url: str = Field(
            default="http://192.168.2.57:11434/api/generate",
            description="URL zur Ollama API",
        )
        judge_model: str = Field(
            default="llama3.2:latest", 
            description="Modell für die Klassifizierung (Muss in 'ollama list' stehen!)"
        )
        model_standard: str = Field(
            default="gpt-oss:20b", description="Standard-Modell"
        )
        model_expert: str = Field(
            default="gpt-oss:120b", description="Experten-Modell"
        )
        model_translate: str = Field(
            default="translategemma:27b", description="Übersetzer"
        )
        show_debug_info: bool = Field(
            default=True,
            description="Zeigt Routing-Analyse am Ende der Antwort.",
        )

    def __init__(self):
        self.valves = self.Valves()
        self.last_used_model_name = "Unbekannt"
        self.last_used_model_id = "-"
        self.last_analysis = "Keine Analyse"

    def inlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
        messages = body.get("messages", [])
        if not messages:
            return body

        user_prompt = messages[-1].get("content", "")

        # Stabiler JSON-Prompt
        system_prompt = (
            "You are a router. Categorize the user request. "
            "Respond ONLY with a JSON object: "
            '{"decision": "TRANSLATE" | "EXPERT" | "STANDARD", "reason": "short explanation"}'
        )

        payload = {
            "model": self.valves.judge_model,
            "prompt": f"{system_prompt}\n\nUser Request: {user_prompt}\n\nJSON Response:",
            "stream": False,
            "format": "json",
            "options": {"num_predict": 100, "temperature": 0}
        }

        decision = "STANDARD"

        try:
            response = requests.post(self.valves.ollama_url, json=payload, timeout=10)
            
            if response.status_code == 200:
                result = response.json()
                data = json.loads(result.get("response", "{}"))
                decision = data.get("decision", "STANDARD").upper()
                self.last_analysis = data.get("reason", "Erfolgreich klassifiziert.")
            else:
                self.last_analysis = f"Fehler {response.status_code}: Modell '{self.valves.judge_model}' evtl. nicht geladen?"
        except Exception as e:
            self.last_analysis = f"Verbindungsfehler: {str(e)}"

        # Modell-Zuweisung
        if "TRANSLATE" in decision:
            target = self.valves.model_translate
            self.last_used_model_name = "Spezialist (Übersetzung)"
        elif "EXPERT" in decision:
            target = self.valves.model_expert
            self.last_used_model_name = "Experte (GPT-OSS 120B)"
        else:
            target = self.valves.model_standard
            self.last_used_model_name = "Standard (GPT-OSS 20B)"

        self.last_used_model_id = target
        body["model"] = target
        return body

    def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict:
        if self.valves.show_debug_info and "messages" in body:
            messages = body.get("messages", [])
            if messages:
                debug_footer = (
                    f"\n\n---\n"
                    f"**Souveräne Infrastruktur-Info:**\n"
                    f"* **Modell-Typ:** {self.last_used_model_name}\n"
                    f"* **Technische ID:** `{self.last_used_model_id}`\n"
                    f"* **Analyse des Judges:** {self.last_analysis}"
                )
                messages[-1]["content"] += debug_footer
        return body