"""
Print the full rich event data structure to find the URL slug fields.
Also checks what markets appear in the standard GetMainMarkets reply.

Usage:
    python3 tools/discover_surebet247_event_url.py
"""
import sys, os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))

import time
from scrapers.surebet247 import _Surebet247Worker, _decode_frame

BASE_SITE  = 'https://www.surebet247.com'


def inspect_rich_events(page) -> list:
    frames_recv = []
    frames_sent = []
    last_recv   = [time.time()]

    def handle_ws(ws):
        if 'direct-feed' not in ws.url:
            return
        ws.on('framereceived', lambda p: (frames_recv.append(p), last_recv.__setitem__(0, time.time())) if isinstance(p, bytes) else None)
        ws.on('framesent',     lambda p: frames_sent.append(p) if isinstance(p, bytes) else None)

    page.on('websocket', handle_ws)
    page.goto(f'{BASE_SITE}/sport/football', wait_until='domcontentloaded', timeout=60_000)
    time.sleep(10)
    for _ in range(4):
        page.mouse.wheel(0, 700)
        time.sleep(0.6)
    deadline = time.time() + 20
    while time.time() < deadline:
        time.sleep(1)
        if time.time() - last_recv[0] > 3.0 and frames_recv:
            break
    try:
        page.remove_listener('websocket', handle_ws)
    except Exception:
        pass

    print(f'  Captured {len(frames_recv)} recv / {len(frames_sent)} sent')

    # Build method map
    method_by_id = {}
    for frame in frames_sent:
        if isinstance(frame, bytes):
            d = _decode_frame(frame)
            if d and isinstance(d, (list, tuple)) and len(d) >= 4 and d[0] == 4:
                method_by_id[str(d[2])] = str(d[3])

    rich_ids = {rid for rid, m in method_by_id.items()
                if m in ('GetRichEventsByTournamentIdAndStage', 'GetRichEventsByIds')}

    results = []
    for frame in frames_recv:
        if not isinstance(frame, bytes):
            continue
        d = _decode_frame(frame)
        if not d or not isinstance(d, (list, tuple)) or d[0] != 2 or len(d) < 4:
            continue
        if str(d[2]) not in rich_ids:
            continue
        reply = d[3]
        if not isinstance(reply, (list, tuple)) or len(reply) < 2 or not reply[0]:
            continue
        for item in (reply[1] or []):
            if not isinstance(item, (list, tuple)) or len(item) < 3:
                continue
            event_id = item[1]
            ev_data  = item[2]
            if not isinstance(ev_data, (list, tuple)):
                continue
            # Show full structure
            results.append({'id': event_id, 'data': list(ev_data)})
            if len(results) >= 2:
                return results
    return results


if __name__ == '__main__':
    worker = _Surebet247Worker()
    events = worker.call(inspect_rich_events, timeout=120)

    print(f'\nFound {len(events)} rich events\n')
    for ev in events:
        print(f'Event ID: {ev["id"]}')
        data = ev['data']
        for i, val in enumerate(data):
            print(f'  [{i}] {repr(val)[:120]}')
        print()
