import time
import requests
import config


def call(method, **params):
    """درخواست به API تلگرام؛ روی خطای اتصال/SSL تا ۳ بار تلاش می‌کند و هیچ‌وقت exception نمی‌دهد."""
    for i in range(3):
        try:
            r = requests.post(f"https://api.telegram.org/bot{config.BOT_TOKEN}/{method}", json=params, timeout=20)
            return r.json()
        except (requests.exceptions.SSLError, requests.exceptions.ConnectionError):
            time.sleep(0.5 * (i + 1) ** 2)
        except Exception:
            break
    return {"ok": False}


def send_message(chat_id, text, reply_markup=None):
    p = {"chat_id": chat_id, "text": text}
    if reply_markup:
        p["reply_markup"] = reply_markup
    return call("sendMessage", **p)


def edit_message_text(chat_id, message_id, text, reply_markup=None):
    return call("editMessageText", chat_id=chat_id, message_id=message_id, text=text,
                reply_markup=reply_markup or {"inline_keyboard": []})


def answer_callback_query(cq_id, text=None, alert=False):
    return call("answerCallbackQuery", callback_query_id=cq_id, text=text or "", show_alert=alert)


def send_document(chat_id, path, caption=""):
    try:
        with open(path, "rb") as f:
            r = requests.post(f"https://api.telegram.org/bot{config.BOT_TOKEN}/sendDocument",
                              data={"chat_id": chat_id, "caption": caption}, files={"document": f}, timeout=60)
        return r.json()
    except Exception:
        return {"ok": False}


def set_webhook(url, secret):
    return call("setWebhook", url=url, secret_token=secret, allowed_updates=["message", "callback_query"])
