import json
import urllib.request

from hermes_brain import MODEL, SYSTEM_PROMPT
from hermes_brain_v2 import obtener_clave
from hermes_epg_tool import consultar_programacion
from hermes_web import buscar_internet
from hermes_tools import ejecutar_herramienta

DECLARACIONES = [
    {
        "name": "consultar_programacion",
        "description": (
            "Busca en las EPG privadas de Sling, Paramount, "
            "USA y México. Devuelve programación y canales."
        ),
        "parameters": {
            "type": "OBJECT",
            "properties": {
                "termino": {"type": "STRING"},
                "dias": {"type": "INTEGER"}
            },
            "required": ["termino"]
        }
    },
    {
        "name": "investigar_internet",
        "description": (
            "Busca información deportiva actualizada "
            "en Internet y devuelve fuentes verificables."
        ),
        "parameters": {
            "type": "OBJECT",
            "properties": {
                "pregunta": {"type": "STRING"}
            },
            "required": ["pregunta"]
        }
    },
    {
        "name": "consultar_servidor",
        "description": (
            "Consulta CPU, RAM, disco y tráfico de red."
        ),
        "parameters": {
            "type": "OBJECT",
            "properties": {}
        }
    }
]

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

    payload = {
        "systemInstruction": {
            "parts": [{
                "text": SYSTEM_PROMPT + """
Utiliza herramientas cuando necesites datos reales.

Para preguntas deportivas:
- Consulta las EPG para identificar programación.
- Utiliza Internet para verificar eventos actuales.
- No confundas programas con partidos.
- No inventes horarios, canales ni fuentes.
- Si una búsqueda web no se ejecutó, dilo.
- Las EPG no garantizan disponibilidad de streaming.

Para preguntas del VPS:
- Consulta las herramientas reales.
- No inventes métricas.

No ejecutes acciones administrativas sin autorización.
"""
            }]
        },
        "contents": contenidos,
        "tools": [{
            "functionDeclarations": DECLARACIONES
        }],
        "generationConfig": {
            "maxOutputTokens": 1200
        }
    }

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

    with urllib.request.urlopen(req, timeout=45) as r:
        return json.load(r)


def ejecutar_herramienta_research(nombre, args):
    if nombre == "consultar_programacion":
        return consultar_programacion(
            args["termino"],
            args.get("dias", 3)
        )

    if nombre == "investigar_internet":
        return buscar_internet(args["pregunta"])

    if nombre == "consultar_servidor":
        return ejecutar_herramienta("consultar_servidor")

    raise ValueError("Herramienta no autorizada")


def investigar(pregunta):
    contenidos = [{
        "role": "user",
        "parts": [{"text": pregunta}]
    }]

    for vuelta in range(3):
        resultado = llamar_gemini(contenidos)
        contenido = resultado["candidates"][0]["content"]

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

        if not llamadas:
            respuesta = "".join(
                p.get("text", "")
                for p in contenido.get("parts", [])
            ).strip()

            return respuesta

        contenidos.append(contenido)
        respuestas = []

        for llamada in llamadas[:3]:
            nombre = llamada["name"]
            args = llamada.get("args", {})

            print("[HERMES TOOL]", nombre, flush=True)

            datos = ejecutar_herramienta_research(
                nombre, args
            )

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

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

    raise RuntimeError(
        "Hermes superó el límite de investigación"
    )
