#!/usr/bin/env python3
"""Read-only helper for the local Qwen llama-server.

Usage examples:
  echo "Long text..." | qwen_readonly.py summarize
  qwen_readonly.py classify "Ist das Finance oder Health?"
  qwen_readonly.py probe

Policy: extraction/summarization/classification/drafting only. No writes, no side effects.
"""
from __future__ import annotations

import json
import os
import sys
import time
import urllib.error
import urllib.request

BASE_URL = os.environ.get("QWEN_BASE_URL", "http://100.101.173.25:11435/v1").rstrip("/")
MODEL = os.environ.get("QWEN_MODEL", "qwen-3.6-agent")
API_KEY = os.environ.get("QWEN_API_KEY", "sk-1234")

SYSTEM = """Du bist Qwen, ein lokaler read-only Worker für JARVIS/Hermes.
Erlaubt: zusammenfassen, extrahieren, klassifizieren, einfache Entwürfe.
Verboten: externe Aktionen, Dateiänderungen, finale Health-/Finance-Entscheide,
Code-/Systemarchitektur-Änderungen als finale Autorität, Secrets anfordern oder ausgeben.
Antworte kurz, strukturiert und markiere Unsicherheiten.
"""

PROMPTS = {
    "probe": "Antworte exakt: pong",
    "summarize": "Fasse den folgenden Text präzise zusammen. Gib Kernaussagen, offene Punkte und Unsicherheiten aus.",
    "extract": "Extrahiere strukturierte Fakten aus dem folgenden Text. Gib JSON-nahe Bulletpoints mit Quelle/Unsicherheit aus.",
    "classify": "Klassifiziere den folgenden Text nach Domain, Risiko, benötigtem Kontext und ob ein starkes Modell nötig ist.",
    "draft": "Erstelle einen knappen Entwurf aus dem folgenden Material. Keine finalen Entscheidungen behaupten.",
}


def read_input(argv: list[str]) -> tuple[str, str]:
    mode = argv[1] if len(argv) > 1 else "summarize"
    if mode not in PROMPTS:
        raise SystemExit(f"Unknown mode {mode!r}. Use one of: {', '.join(PROMPTS)}")
    if mode == "probe":
        text = ""
    elif len(argv) > 2:
        text = " ".join(argv[2:])
    else:
        text = sys.stdin.read()
    return mode, text.strip()


def call_qwen(mode: str, text: str) -> dict:
    user = PROMPTS[mode]
    if text:
        user += "\n\n--- INPUT ---\n" + text
    payload = {
        "model": MODEL,
        "messages": [
            {"role": "system", "content": SYSTEM},
            {"role": "user", "content": user},
        ],
        "temperature": 0.1 if mode in {"probe", "extract", "classify"} else 0.3,
        "max_tokens": 1200 if mode != "probe" else 16,
    }
    req = urllib.request.Request(
        BASE_URL + "/chat/completions",
        data=json.dumps(payload).encode("utf-8"),
        headers={"Content-Type": "application/json", "Authorization": f"Bearer {API_KEY}"},
        method="POST",
    )
    started = time.time()
    with urllib.request.urlopen(req, timeout=60) as resp:
        raw = resp.read().decode("utf-8")
    data = json.loads(raw)
    return {
        "ok": True,
        "base_url": BASE_URL,
        "model": MODEL,
        "mode": mode,
        "latency_ms": round((time.time() - started) * 1000),
        "content": data.get("choices", [{}])[0].get("message", {}).get("content", ""),
    }


def main() -> int:
    mode, text = read_input(sys.argv)
    try:
        result = call_qwen(mode, text)
    except urllib.error.URLError as e:
        result = {"ok": False, "base_url": BASE_URL, "model": MODEL, "mode": mode, "error": str(e)}
    except Exception as e:
        result = {"ok": False, "base_url": BASE_URL, "model": MODEL, "mode": mode, "error": type(e).__name__ + ": " + str(e)}
    print(json.dumps(result, ensure_ascii=False, indent=2))
    return 0 if result.get("ok") else 2


if __name__ == "__main__":
    raise SystemExit(main())
