"""
Wrapper mínimo sobre la API HTTP de Telegram. Usamos requests directo
en vez de una librería grande, porque en hosting compartido conviene
mantener las dependencias livianas.
"""
import requests

from config import TELEGRAM_BOT_TOKEN

BASE_URL = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}"


def enviar_mensaje(chat_id, texto, parse_mode="HTML", teclado=None):
    payload = {
        "chat_id": chat_id,
        "text": texto,
        "parse_mode": parse_mode,
        "disable_web_page_preview": False,
    }
    if teclado:
        payload["reply_markup"] = teclado
    resp = requests.post(f"{BASE_URL}/sendMessage", json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()


def enviar_foto(chat_id, foto_url, caption, parse_mode="HTML", teclado=None):
    payload = {
        "chat_id": chat_id,
        "photo": foto_url,
        "caption": caption,
        "parse_mode": parse_mode,
    }
    if teclado:
        payload["reply_markup"] = teclado
    resp = requests.post(f"{BASE_URL}/sendPhoto", json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()


def responder_callback(callback_query_id, texto=None, alerta=False):
    """Le avisa a Telegram que ya procesamos el tap de un botón (saca el
    ícono de 'cargando' del botón). Opcionalmente muestra un toast."""
    payload = {"callback_query_id": callback_query_id}
    if texto:
        payload["text"] = texto
        payload["show_alert"] = alerta
    resp = requests.post(f"{BASE_URL}/answerCallbackQuery", json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()


def set_boton_menu(url, texto="Catálogo"):
    """Configura el botón de menú nativo de Telegram (al lado del campo de
    texto) para que abra el Mini App directamente."""
    payload = {
        "menu_button": {
            "type": "web_app",
            "text": texto,
            "web_app": {"url": url},
        }
    }
    resp = requests.post(f"{BASE_URL}/setChatMenuButton", json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()


def set_comandos(comandos):
    """comandos: lista de {'command': 'ofertas', 'description': '...'}.
    Esto es lo que hace aparecer el menú ☰ nativo de Telegram."""
    resp = requests.post(f"{BASE_URL}/setMyCommands", json={"commands": comandos}, timeout=10)
    resp.raise_for_status()
    return resp.json()


def obtener_updates(offset=None, timeout=30):
    """Long polling: le pregunta a Telegram por mensajes nuevos.
    Se queda esperando hasta 'timeout' segundos si no hay nada nuevo."""
    params = {"timeout": timeout}
    if offset is not None:
        params["offset"] = offset
    resp = requests.get(f"{BASE_URL}/getUpdates", params=params, timeout=timeout + 10)
    resp.raise_for_status()
    return resp.json().get("result", [])


def set_webhook(url, secret_token=None):
    payload = {"url": url}
    if secret_token:
        payload["secret_token"] = secret_token
    resp = requests.post(f"{BASE_URL}/setWebhook", json=payload, timeout=10)
    resp.raise_for_status()
    return resp.json()


def eliminar_webhook():
    resp = requests.post(f"{BASE_URL}/deleteWebhook", timeout=10)
    resp.raise_for_status()
    return resp.json()
