"""Optionaler LLM-Layer: variiert Template-Antworten per Ollama.

Das LLM formuliert NUR um — die Regeln (rules.py) entscheiden weiterhin,
ob geantwortet wird. Ausgabe wird hart validiert; bei jedem Zweifel
gewinnt das Template. Default: aus (TIBIAPILOT_CHAT_LLM=1 aktiviert).
"""
import json
import os
import urllib.request

LLM_ENV = 'TIBIAPILOT_CHAT_LLM'
LLM_URL_ENV = 'TIBIAPILOT_CHAT_LLM_URL'
# Standardmaessig das lokale Ollama auf dem Bot-PC (Install-Llm.ps1 zieht
# dafuer das Chat-Modell mit). So funktioniert es ohne Abhaengigkeit von
# einem separaten Server; ein zentrales Ollama laesst sich weiterhin ueber
# TIBIAPILOT_CHAT_LLM_URL vorgeben.
DEFAULT_URL = 'http://localhost:11434/api/generate'
MODEL_ENV = 'TIBIAPILOT_CHAT_LLM_MODEL'
DEFAULT_MODEL = 'qwen3:4b'
MAX_REPLY_CHARS = 120
BANNED_WORDS = ('bot', 'macro', 'script', 'afk-farm', 'cheat')

PROMPT = (
    'Du spielst Tibia und chattest ingame. Formuliere die folgende '
    'Antwort EINMAL anders: kurz, locker, alltaeglich, max. 12 Woerter, '
    'keine Emojis, keine Hashtags, keine Erklaerungen, nur die Antwortzeile.\n'
    'Eingehend: {incoming}\nAntwortentwurf: {template}\nAntwort:'
)


def enabled():
    return os.getenv(LLM_ENV, '0') == '1'


def _validate(text):
    text = ' '.join((text or '').strip().split())
    if not text or len(text) > MAX_REPLY_CHARS:
        return None
    lowered = text.lower()
    if any(word in lowered for word in BANNED_WORDS):
        return None
    return text


def reword(incoming, template, timeout=8):
    """LLM-Umformulierung oder None (dann gilt das Template)."""
    if not enabled():
        return None
    url = os.getenv(LLM_URL_ENV, DEFAULT_URL)
    payload = json.dumps({
        'model': os.getenv(MODEL_ENV, DEFAULT_MODEL),
        'prompt': PROMPT.format(incoming=incoming, template=template),
        'stream': False,
        'options': {'temperature': 0.9, 'num_predict': 60},
    }).encode('utf-8')
    try:
        request = urllib.request.Request(
            url, data=payload,
            headers={'Content-Type': 'application/json'},
        )
        with urllib.request.urlopen(request, timeout=timeout) as response:
            body = json.loads(response.read().decode('utf-8'))
    except (OSError, ValueError):
        return None
    return _validate(body.get('response'))
