import urllib.request
from hermes_brain_v2 import obtener_clave
from hermes_brain import MODEL, SYSTEM_PROMPT
from hermes_memory import guardar, historial
from hermes_tools import ejecutar_herramienta
from hermes_epg_tool import consultar_programacion

import json

DECLARACIONES = [
    {
        "name": "consultar_servidor",
        "description": (
            "Consulta CPU, RAM, disco y tráfico real "
            "de subida y bajada del VPS."
        ),
        "parameters": {
            "type": "OBJECT",
            "properties": {}
        }
    },
    {
        "name": "consultar_programacion",
        "description": (
            "Busca programación en las EPG privadas "
            "de Sling, Paramount, USA y México. "
            "Devuelve canales, títulos y horarios "
            "en la zona America/Tijuana. "
            "Las coincidencias no confirman por sí "
            "solas que sean partidos en vivo."
        ),
        "parameters": {
            "type": "OBJECT",
            "properties": {
                "termino": {
                    "type": "STRING",
                    "description": "Equipo, liga o evento a buscar"
                },
                "dias": {
                    "type": "INTEGER",
                    "description": "Días futuros, entre 1 y 7"
                }
            },
            "required": ["termino"]
        }
    }
]


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

    payload = {
        "systemInstruction": {
            "parts": [{"text": SYSTEM_PROMPT}]
        },
        "contents": contenidos,
        "tools": [{
            "functionDeclarations": DECLARACIONES
        }],
        "generationConfig": {
            "maxOutputTokens": 1000
        }
    }

    solicitud = 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(solicitud, timeout=45) as r:
        return json.load(r)


def ejecutar(nombre, argumentos):
    if nombre == "consultar_servidor":
        return ejecutar_herramienta(nombre)

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

    raise ValueError("Herramienta no autorizada")


def preguntar_hermes_v3(pregunta, usuario, sesion):
    contenidos = historial(usuario, sesion, limite=12)

    contenidos.append({
        "role": "user",
        "parts": [{"text": pregunta}]
    })

    primera = llamar_gemini_v3(contenidos)
    contenido = primera["candidates"][0]["content"]

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

    if llamadas:
        contenidos.append(contenido)
        respuestas = []

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

            resultado = ejecutar(nombre, argumentos)

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

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

        segunda = llamar_gemini_v3(contenidos)
        contenido = segunda["candidates"][0]["content"]

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

    if not respuesta:
        raise RuntimeError("Gemini no devolvió texto")

    guardar(usuario, sesion, "user", pregunta)
    guardar(usuario, sesion, "model", respuesta)

    return respuesta
