#!/usr/bin/env python3
# Pragmatic Play 回合详情拉取 + "购买免费游戏 vs 普通点击" 判断
# 链路：彩虹 queryOrderInfo(注单数字id) -> PP壳页拿token -> PP history接口拿回合玩法
import re, json
from urllib.parse import urlparse, parse_qs, urlencode
from curl_cffi import requests
from client import api   # 复用彩虹后台客户端

PP_ROOT = "https://q5f2m3bd.zavjcswh.biz/gs2c/api"   # 注意：域名可能随上游变化


def _get_token_and_query(bet_id):
    """用彩虹注单数字id换 PP 壳页URL，取出 token 和 playSessionId/stylename/hash"""
    loader_url = api(f"/betManage/userBet/queryOrderInfo/{bet_id}", method="GET")["data"]
    r = requests.get(loader_url, impersonate="chrome", timeout=30)
    m = re.search(r'window\.token\s*=\s*"([0-9a-f]+)"', r.text)
    if not m:
        raise RuntimeError("没拿到 PP token，壳页内容：" + r.text[:200])
    q = {k: v[0] for k, v in parse_qs(urlparse(loader_url).query).items()}
    return m.group(1), q, loader_url


def get_round_actions(bet_id):
    """拿某注单对应的 PP 回合所有动作（含 request/response 玩法明细）"""
    token, q, loader_url = _get_token_and_query(bet_id)
    u = urlparse(loader_url)
    pp_root = f"{u.scheme}://{u.netloc}/gs2c/api"   # 从回放URL动态取域名(会轮换)
    base = {"token": token, "playSessionId": q["playSessionId"],
            "stylename": q.get("stylename", ""), "hash": q.get("hash", ""),
            "language": "zh"}
    url = f"{pp_root}/history/v3/action/children?id={q['playSessionId']}&" + urlencode(base)
    r = requests.post(url, impersonate="chrome", timeout=25, headers={"Referer": loader_url})
    return r.json()


def classify(bet_id):
    """判断该注单的玩法类型：
      bought  购买免费游戏 (花钱直接买 free spins)
      free    自然触发的免费游戏 (转出scatter赢的，没花钱买)
      normal  普通转动
    判断核心字段：
      purtr (purchase triggered) = "1"  -> 购买触发的免费游戏
      pur(request)               = "1"  -> 该把就是购买动作
      fs / fsmax 存在                    -> 处于免费游戏中
      ch_k/trail 只是"可购买菜单"，每把都显示，≠ 已购买
    返回 {kind, bought, in_free_spins, reason, markers}"""
    data = get_round_actions(bet_id)
    items = data.get("data") or []
    if not items:
        return {"kind": None, "bought": None, "reason": "无回合数据", "markers": {}}

    req = items[0].get("request", {})
    resp = items[0].get("response", {})

    purtr = str(resp.get("purtr", ""))          # purchase triggered
    pur_req = str(req.get("pur", ""))            # 请求里的购买标志
    in_fs = ("fs" in resp) or ("fsmax" in resp) # 是否在免费游戏中

    bought = (purtr == "1") or (pur_req == "1")

    if bought:
        kind, reason = "bought", f"purtr={purtr or '-'}, req.pur={pur_req or '-'} -> 购买免费游戏"
    elif in_fs:
        kind, reason = "free", "有 fs/fsmax 但 purtr!=1 -> 自然触发的免费游戏(非购买)"
    else:
        kind, reason = "normal", "无 fs/purtr -> 普通转动"

    markers = {k: resp.get(k) for k in ("purtr", "puri", "fs", "fsmax", "ch_k", "trail") if k in resp}
    markers["req.pur"] = req.get("pur")
    markers["symbol"] = req.get("symbol")
    markers["bet"] = data["data"][0].get("response", {}).get("ntp")  # 净投注(负)
    return {"kind": kind, "bought": bought, "in_free_spins": in_fs,
            "reason": reason, "markers": markers}


# 兼容旧名
def is_bonus_buy(bet_id):
    return classify(bet_id)


if __name__ == "__main__":
    import sys
    # 用法：python3 pp_round.py <注单数字id>   (id 不是OT开头那串，是列表里的 id 字段)
    bid = sys.argv[1] if len(sys.argv) > 1 else 87
    print(json.dumps(classify(bid), ensure_ascii=False, indent=2))
