"""Bot de desarrollo para UN chat privado autorizado. No es webhook de producción.
Requiere agente_stock.py, openai y cuatro variables de entorno; ver la guía.
No guarda historial ni reintenta mensajes fallidos. Detener con Ctrl+C.
"""
import json
import os
import time
import urllib.request
from agente_stock import responder


def telegram(token, metodo, datos):
    request = urllib.request.Request(
        f"https://api.telegram.org/bot{token}/{metodo}",
        data=json.dumps(datos).encode(),
        headers={"Content-Type": "application/json"},
    )
    with urllib.request.urlopen(request, timeout=30) as response:
        resultado = json.load(response)
    if not resultado.get("ok"):
        raise RuntimeError("Telegram rechazó la petición")
    return resultado["result"]


def partes(texto, limite=1800):
    # Sin parse_mode. 1800 puntos de código caben incluso si todos usan pares UTF-16.
    return [texto[i:i + limite] for i in range(0, len(texto), limite)]


def main():
    from openai import OpenAI
    token = os.environ["TELEGRAM_BOT_TOKEN"]
    chat_permitido = int(os.environ["TELEGRAM_ALLOWED_CHAT_ID"])
    modelo = os.environ["OPENAI_MODEL"]
    cliente = OpenAI(timeout=20.0, max_retries=0)
    if telegram(token, "getWebhookInfo", {}).get("url"):
        raise SystemExit("Hay un webhook activo. Usa otro bot de desarrollo o retíralo conscientemente.")
    offset = 0
    print("Bot local activo. Solo responde al chat privado autorizado. Ctrl+C para salir.")
    while True:
        try:
            updates = telegram(token, "getUpdates", {
                "offset": offset, "timeout": 20, "limit": 1,
                "allowed_updates": ["message"],
            })
            for update in updates:
                # Avance en RAM: evita reintentos del LLM durante esta ejecución.
                # No garantiza exactly-once ni recuperación tras reiniciar.
                offset = update["update_id"] + 1
                mensaje = update.get("message", {})
                chat = mensaje.get("chat", {})
                texto = mensaje.get("text")
                if chat.get("type") != "private" or chat.get("id") != chat_permitido or not texto:
                    continue
                if len(texto) > 1000:
                    respuesta = "Envía una pregunta de hasta 1000 caracteres."
                elif texto.startswith("/start"):
                    respuesta = "Consulto stock ficticio de A-100, B-200 y C-300. No reservo productos."
                else:
                    telegram(token, "sendChatAction", {"chat_id": chat_permitido, "action": "typing"})
                    respuesta = responder(cliente, texto, modelo)
                for parte in partes(respuesta):
                    telegram(token, "sendMessage", {"chat_id": chat_permitido, "text": parte})
                    time.sleep(1.1)
        except Exception:
            # No imprimir la excepción: algunas incluyen la URL con el token del bot.
            print("Petición fallida; revisa cuota, conexión y configuración sin publicar secretos.")
            time.sleep(5)


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("Bot detenido.")
