#!/usr/bin/env python3
import ssl, socket, json

TOKEN = "8781986513:AAFnD-EYQPUiv4noJgZjk_9CsEHPvcTsEN4"
HOST = "api.telegram.org"

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

def call(method, params, read_timeout=30):
    body_b = b""
    if params:
        parts = []
        for k, v in params.items():
            k_str = str(k).encode("utf-8")
            v_str = str(v).encode("utf-8")
            for c in k_str:
                if c in b" :/?#[]@!$&'()*+,;=%":
                    parts.append(b"%%%02X" % c)
                else:
                    parts.append(bytes([c]))
            parts.append(b"=")
            for c in v_str:
                if c in b" :/?#[]@!$&'()*+,;=%\n\r\t\x00":
                    parts.append(b"%%%02X" % c)
                else:
                    parts.append(bytes([c]))
            parts.append(b"&")
        if parts: parts.pop()
        body_b = b"".join(parts)
    
    url = "/bot" + TOKEN + "/" + method
    req = "POST " + url + " HTTP/1.1\r\nHost: " + HOST + "\r\n"
    req += "Content-Type: application/x-www-form-urlencoded\r\n"
    req += "Content-Length: " + str(len(body_b)) + "\r\nConnection: close\r\n\r\n"
    
    sock = socket.create_connection((HOST, 443), timeout=15)
    ssock = ctx.wrap_socket(sock, server_hostname=HOST)
    ssock.settimeout(read_timeout)
    ssock.sendall(req.encode() + body_b)
    
    resp = b""
    try:
        while True:
            d = ssock.read(8192)
            if not d: break
            resp += d
    except socket.timeout:
        pass
    ssock.close()
    
    _, _, body = resp.partition(b"\r\n\r\n")
    if body:
        return json.loads(body.decode("utf-8", errors="replace"))
    return None

# Test 1: short getUpdates (no timeout)
print("=== Short poll (timeout=0) ===")
r = call("getUpdates", {"timeout": "0"}, read_timeout=10)
print("OK:", r.get("ok") if r else None, "Results:", len(r.get("result", [])) if r else 0)

# Show any results
if r and r.get("result"):
    for u in r["result"]:
        print("  Update:", u["update_id"], u.get("message", {}).get("text", ""))

# Test 2: send a message
print("\n=== Send message ===")
r = call("sendMessage", {"chat_id": 6433272324, "text": "Test from socket bot", "parse_mode": "Markdown"}, read_timeout=10)
print("OK:", r.get("ok") if r else None)

# Test 3: long-poll with timeout=5
print("\n=== Long poll (timeout=5) ===")
r = call("getUpdates", {"timeout": "5", "offset": "476029537"}, read_timeout=10)
print("OK:", r.get("ok") if r else None, "Results:", len(r.get("result", [])) if r else 0)

print("\nAll tests done!")
