import json
import urllib.request

from hermes_brain import ENV_FILE, MODEL, SYSTEM_PROMPT
from hermes_tools import ejecutar_herramienta

with open(ENV_FILE, encoding="utf-8") as f:
    claves = [
        linea.strip().split("=", 1)[1]
        for linea in f
        if linea.startswith("GEMINI_API_KEY=")
    ]

if not claves:
    raise RuntimeError("Clave Gemini no configurada")

key = claves[0]

url = (
    "https://generativelanguage.googleapis.com/v1beta/"
    f"models/{MODEL}:generateContent"
)

declaracion = {
    "name": "consultar_servidor",
    "description": (
        "Consulta el uso real de CPU y RAM del servidor Hermes Nexus. "
        "Utiliza esta herramienta cuando el usuario pregunte por "
        "CPU, RAM, memoria o recursos del VPS."
    ),
    "parameters": {
        "type": "OBJECT",
        "properties": {}
    }
}

def llamar_gemini(contents):
    payload = {
        "systemInstruction": {
            "parts": [{"text": SYSTEM_PROMPT}]
        },
        "contents": contents,
        "tools": [{
            "functionDeclarations": [declaracion]
        }],
        "generationConfig": {
            "maxOutputTokens": 500
        }
    }

    request = urllib.request.Request(
        url,
        data=json.dumps(payload).encode("utf-8"),
        headers={
            "Content-Type": "application/json",
            "x-goog-api-key": key
        },
        method="POST"
    )

    with urllib.request.urlopen(request, timeout=30) as response:
        return json.load(response)

pregunta = "Hermes, consulta el consumo real de CPU y RAM del VPS."

historial = [{
    "role": "user",
    "parts": [{"text": pregunta}]
}]

primera = llamar_gemini(historial)
contenido = primera["candidates"][0]["content"]

llamadas = [
    parte["functionCall"]
    for parte in contenido.get("parts", [])
    if "functionCall" in parte
]

if not llamadas:
    print("Gemini no solicitó ninguna herramienta.")
    print(contenido)
    raise SystemExit(1)

historial.append(contenido)

respuestas = []

for llamada in llamadas:
    nombre = llamada["name"]

    if nombre != "consultar_servidor":
        raise RuntimeError("Herramienta no autorizada")

    datos = ejecutar_herramienta(nombre)

    print("HERRAMIENTA EJECUTADA:", nombre)
    print("DATOS REALES:", datos)

    respuestas.append({
        "functionResponse": {
            "name": nombre,
            "response": {"result": datos}
        }
    })

historial.append({
    "role": "user",
    "parts": respuestas
})

segunda = llamar_gemini(historial)

texto = "".join(
    parte.get("text", "")
    for parte in segunda["candidates"][0]["content"]["parts"]
)

print("\n=== RESPUESTA DE HERMES ===")
print(texto)
