"""Phase 2: probe correct GQL schema after learning field names from errors."""
import json, time
from playwright.sync_api import sync_playwright

GQL_URL = 'https://stake.com/_api/graphql'
LIVE_GQL = []

def gql(page, op, query, variables=None):
    body = {'operationName': op, 'query': query, 'variables': variables or {}}
    result = page.evaluate('''async ({url, body}) => {
        const r = await fetch(url, {
            method: 'POST', credentials: 'include',
            headers: {'Content-Type': 'application/json', 'Accept': 'application/json'},
            body: JSON.stringify(body),
        });
        return {status: r.status, body: await r.text()};
    }''', {'url': GQL_URL, 'body': body})
    status = result['status']
    try:
        data = json.loads(result['body'])
    except Exception:
        data = result['body']
    return status, data

def run():
    with sync_playwright() as pw:
        browser = pw.chromium.launch(
            headless=False,
            executable_path='/usr/bin/google-chrome-stable',
            args=['--no-sandbox', '--disable-blink-features=AutomationControlled'],
        )
        ctx = browser.new_context(locale='en-US',
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
        page = ctx.new_page()

        # Capture live GQL calls the page makes
        def on_req(req):
            if '_api/graphql' in req.url and req.method == 'POST':
                try:
                    b = req.post_data_json
                    LIVE_GQL.append({'op': b.get('operationName','?'), 'vars': b.get('variables',{})})
                except Exception:
                    pass
        page.on('request', on_req)

        print("[1] Loading stake.com/sports/soccer...")
        try:
            page.goto('https://stake.com/sports/soccer', timeout=90_000, wait_until='domcontentloaded')
        except Exception as e:
            print(f"  warn: {e}")
        time.sleep(10)
        print(f"  title: {page.title()}")

        # Scroll to load fixture list
        print("[2] Scrolling to trigger fixture loads...")
        page.evaluate('window.scrollTo(0, 500)')
        time.sleep(5)
        page.evaluate('window.scrollTo(0, 1000)')
        time.sleep(5)
        
        print(f"  Live GQL calls captured: {[x['op'] for x in LIVE_GQL]}")

        # Probe 1: sportList
        print("\n[3] Probing sportList...")
        st, data = gql(page, 'SportList', 'query SportList { sportList { id name slug extId } }')
        print(f"  status={st}")
        if 'data' in data and data['data'].get('sportList'):
            for sp in data['data']['sportList'][:10]:
                print(f"    {sp}")
        else:
            print(f"  response: {json.dumps(data)[:400]}")

        # Probe 2: sport with sportId
        print("\n[4] Probing sport(sportId='soccer')...")
        st, data = gql(page, 'SportFixtures', '''query SportFixtures($sportId: String!) {
            sport(sportId: $sportId) {
                id name slug extId
            }
        }''', {'sportId': 'soccer'})
        print(f"  status={st} response: {json.dumps(data)[:400]}")

        # Probe 3: look for fixtures query
        print("\n[5] Probing top-level fixtures/events...")
        for op_name, q in [
            ('Fixtures', 'query Fixtures { fixtures(status: UPCOMING, limit: 5) { id name } }'),
            ('SportEvents', 'query SportEvents { sportEvents(limit: 5) { id name } }'),
            ('EventList', 'query EventList { eventList(limit: 5) { id name } }'),
        ]:
            st, data = gql(page, op_name, q)
            print(f"  {op_name}: status={st} err={data.get('errors',[{}])[0].get('message','ok')[:100] if 'errors' in data else 'ok'}")

        # Probe 4: try sportByExtId
        print("\n[6] Probing sportByExtId...")
        st, data = gql(page, 'SportByExtId', '''query SportByExtId($extId: String!) {
            sportByExtId(extId: $extId) { id name slug fixtures(status: UPCOMING, limit: 5) { id name startTime } }
        }''', {'extId': 'soccer'})
        print(f"  status={st} response: {json.dumps(data)[:400]}")

        # Probe 5: try introspection to find query fields
        print("\n[7] Introspection query (Query fields)...")
        st, data = gql(page, 'Introspect', '''{ __schema { queryType { fields { name args { name type { name kind ofType { name kind } } } } } } }''')
        if 'data' in data and data['data'].get('__schema'):
            fields = data['data']['__schema']['queryType']['fields']
            sport_fields = [f for f in fields if 'sport' in f['name'].lower() or 'fixture' in f['name'].lower() or 'event' in f['name'].lower() or 'match' in f['name'].lower()]
            print(f"  Sport/fixture/event query fields:")
            for f in sport_fields:
                args = [(a['name'], (a['type'].get('name') or a['type'].get('ofType',{}).get('name',''))) for a in f['args']]
                print(f"    {f['name']}({args})")
        else:
            print(f"  status={st} response: {json.dumps(data)[:400]}")

        browser.close()

if __name__ == '__main__':
    run()
