import sys, time
from pathlib import Path
sys.path.append(str(Path("05_Production_Pipeline").resolve()))
from invisible_playwright import InvisiblePlaywright
from muse_invpw_driver import DEFAULT_PROFILE

def diagnose_hang():
    with InvisiblePlaywright(profile_dir=DEFAULT_PROFILE, headless=True) as ctx:
        page = ctx.pages[0] if ctx.pages else ctx.new_page()
        
        # 1. Capture console messages
        page.on("console", lambda msg: print(f"[CONSOLE {msg.type.upper()}] {msg.text}"))
        page.on("pageerror", lambda err: print(f"[PAGE ERROR] {err}"))
        
        # 2. Capture WebSocket events
        def on_ws(ws):
            print(f"[WS OPENED] {ws.url}")
            ws.on("framesent", lambda payload: print(f"  [WS SEND] {payload[:120]}"))
            ws.on("framereceived", lambda payload: print(f"  [WS RECV] {payload[:120]}"))
            ws.on("close", lambda: print(f"[WS CLOSED] {ws.url}"))
            ws.on("socketerror", lambda err: print(f"[WS ERROR] {err}"))
        page.on("websocket", on_ws)
        
        # 3. Capture failing or pending HTTP requests
        page.on("requestfailed", lambda req: print(f"[REQ FAILED] {req.method} {req.url} - {req.failure}"))
        page.on("response", lambda res: print(f"[HTTP {res.status}] {res.method} {res.url[:90]}") if res.status >= 400 or "wake" in res.url or "hatch" in res.url or "ws" in res.url or "falco" in res.url else None)
        
        print("Navigating to https://muse.ai/thread/new ...")
        page.goto("https://muse.ai/thread/new", wait_until="domcontentloaded", timeout=30000)
        
        for sec in range(30):
            time.sleep(1)
            if sec % 5 == 0:
                print(f"[{sec}s] Page URL: {page.url}")
                # Check status text
                try:
                    conn_text = page.locator('aside, [class*="mascot"], [class*="sidebar"]').inner_text()
                    status_line = [l.strip() for l in conn_text.splitlines() if "kết nối" in l.lower() or "đang" in l.lower()]
                    print(f"      Status: {status_line}")
                except Exception:
                    pass

if __name__ == '__main__':
    diagnose_hang()
