#!/usr/bin/env python3
# Telegram 藏分查询机器人
# 用法：在 Telegram 里给机器人发一个用户ID(如 1000010)，它扫描该用户并回复是否藏分。
# 依赖：client.py + replay_read.py + scanner.py (playwright + 系统Chrome)
#
# 准备：
#   1) 在 Telegram 找 @BotFather -> /newbot -> 拿到 token
#   2) 把 token 写进 telegram_token.txt(本目录)，或设环境变量 TG_BOT_TOKEN
#   3) python3 bot.py
import os, json, time, urllib.request, urllib.parse, traceback
from scanner import scan

def _token():
    t = os.environ.get("TG_BOT_TOKEN")
    if not t and os.path.exists("telegram_token.txt"):
        t = open("telegram_token.txt").read().strip()
    if not t:
        raise SystemExit("缺少 bot token：写入 telegram_token.txt 或设 TG_BOT_TOKEN")
    return t

TOKEN = _token()
API = f"https://api.telegram.org/bot{TOKEN}"


def tg(method, **params):
    data = urllib.parse.urlencode(params).encode()
    with urllib.request.urlopen(f"{API}/{method}", data=data, timeout=60) as r:
        return json.loads(r.read())


def send(chat_id, text):
    try:
        tg("sendMessage", chat_id=chat_id, text=text)
    except Exception:
        traceback.print_exc()


def format_result(uid, res):
    conf = res.get("confirmed_hidden_score", [])
    head = (f"用户 {uid} 扫描完成\n"
            f"注单 {res['scanned']} | 嫌疑候选(赢0且投注≥10) {res['win0_ge_minbet']} "
            f"| 新查 {res['newly_checked']} 缓存 {res['from_cache']}")
    if not conf:
        return f"✅ {head}\n\n未发现藏分。"
    lines = [f"🚩 {head}\n\n发现 {len(conf)} 笔藏分(购买功能且赢取0):"]
    for c in conf:
        lines.append(
            f"\n• 注单 {c['betId']} | {c['game']} [{c['dealer']}]"
            f"\n  投注 {c['betAmount']} 赢取 0 | {c['time']}"
            f"\n  标志: {'/'.join(c['markers'])}"
            f"\n  单号: {c['orderNo']}"
        )
    return "\n".join(lines)


def handle(chat_id, text):
    text = (text or "").strip()
    if text in ("/start", "/help"):
        send(chat_id, "发我一个用户ID(纯数字，如 1000010)，我查他有没有藏分(购买功能且赢取0)。\n注：扫描需逐单渲染回放，可能要几分钟。")
        return
    if not text.isdigit():
        send(chat_id, "请发纯数字用户ID，例如 1000010。")
        return
    uid = int(text)
    send(chat_id, f"🔍 正在扫描用户 {uid} …(逐单渲染回放，请稍候几分钟)")
    try:
        res = scan({"userId": uid}, headless=True)
        send(chat_id, format_result(uid, res))
    except Exception as e:
        traceback.print_exc()
        send(chat_id, f"扫描出错：{e}")


def main():
    print("Bot 启动，等待消息… (Ctrl+C 退出)")
    offset = None
    while True:
        try:
            params = {"timeout": 25}
            if offset is not None:
                params["offset"] = offset
            resp = tg("getUpdates", **params)
            for up in resp.get("result", []):
                offset = up["update_id"] + 1
                msg = up.get("message") or up.get("edited_message")
                if not msg:
                    continue
                handle(msg["chat"]["id"], msg.get("text", ""))
        except KeyboardInterrupt:
            break
        except Exception:
            traceback.print_exc()
            time.sleep(3)


if __name__ == "__main__":
    main()
