"""
Fetch the sport-iframe features/marketLayouts JSON from inside the browser session.

These files are access-denied from curl but may be accessible from inside
the authenticated browser context that the normal scraper sets up.

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

import time, json
from scrapers.surebet247 import _Surebet247Worker, _decode_frame

BASE_SITE = 'https://www.surebet247.com'
IFRAME_ORIGIN = 'https://sport-iframe.serhjs.xyz'

JSON_FILES = [
    'marketLayouts.96a43545918cf8f73189b2b423315ded.json',
    'features.91485fb6d909dcc3d6cb678392b2f7a1.json',
    'sportWidgets.145c1588211e84950913fd8bb73fbac1.json',
    'common.2d85159d666e2284fee23bc02d85286e.json',
]


def fetch_files(page):
    results = {}
    last_recv = [time.time()]
    frames_recv = []

    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)

    page.on('websocket', handle_ws)

    print('  Loading football page to establish session...')
    page.goto(f'{BASE_SITE}/sport/football', wait_until='domcontentloaded', timeout=60_000)
    time.sleep(10)
    deadline = time.time() + 15
    while time.time() < deadline:
        time.sleep(1)
        if time.time() - last_recv[0] > 3.0 and frames_recv:
            break

    print(f'  Captured {len(frames_recv)} WS frames from listing page')

    # Try fetching files via JavaScript fetch() from inside the page context
    for fname in JSON_FILES:
        url = f'{IFRAME_ORIGIN}/{fname}'
        print(f'\n  Fetching: {fname}')
        try:
            result = page.evaluate(f"""async () => {{
                try {{
                    const r = await fetch({json.dumps(url)});
                    const text = await r.text();
                    return {{ status: r.status, body: text.slice(0, 5000) }};
                }} catch(e) {{
                    return {{ error: e.toString() }};
                }}
            }}""")
            results[fname] = result
        except Exception as e:
            results[fname] = {'error': str(e)}

    # Also try fetching from within the sport-iframe context (iframes)
    print('\n  Checking for sport-iframe iframes...')
    frames_in_page = page.frames
    print(f'  Frames in page: {[f.url for f in frames_in_page]}')

    for frame in frames_in_page:
        if 'serhjs.xyz' in frame.url or 'sport-iframe' in frame.url:
            print(f'\n  Found sport-iframe frame: {frame.url}')
            for fname in JSON_FILES[:2]:
                url = f'{IFRAME_ORIGIN}/{fname}'
                try:
                    result = frame.evaluate(f"""async () => {{
                        try {{
                            const r = await fetch({json.dumps(url)});
                            const text = await r.text();
                            return {{ status: r.status, body: text.slice(0, 5000) }};
                        }} catch(e) {{
                            return {{ error: e.toString() }};
                        }}
                    }}""")
                    results[f'frame:{fname}'] = result
                except Exception as e:
                    results[f'frame:{fname}'] = {'error': str(e)}

    return results


if __name__ == '__main__':
    print('Fetching sport-iframe JSON config files from browser context...\n')
    worker = _Surebet247Worker()
    results = worker.call(fetch_files, timeout=120)

    for fname, data in results.items():
        print(f'\n{"="*60}')
        print(f'File: {fname}')
        if 'error' in data:
            print(f'  Error: {data["error"]}')
        elif 'body' in data:
            print(f'  Status: {data.get("status")}')
            body = data['body']
            if body:
                try:
                    parsed = json.loads(body)
                    print(f'  JSON keys: {list(parsed.keys())[:20] if isinstance(parsed, dict) else type(parsed).__name__}')
                    # Search for profile-related strings
                    body_str = json.dumps(parsed)
                    if 'pro_' in body_str:
                        import re
                        profiles = re.findall(r'"pro_[a-z_0-9]+"', body_str)
                        print(f'  Profile names found: {list(set(profiles))}')
                    if 'btts' in body_str.lower() or 'both' in body_str.lower():
                        print(f'  Contains "btts"/"both" references!')
                    print(f'  Preview: {body[:300]}')
                except Exception:
                    print(f'  Raw preview: {body[:300]}')
            else:
                print('  Empty body')
