import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        br = await p.chromium.launch(headless=True)
        pg = await br.new_page()
        await pg.set_viewport_size({'width':1536,'height':1024})
        await pg.goto('http://localhost:8090/DOZIKWORKS_OS_v4_pathcreate.dc.html')
        await pg.wait_for_timeout(18000)

        # 1. FK 4점 검증
        fk4 = await pg.evaluate("""async () => {
            const app = window.__dzw;
            const r = await fetch('/weld_path.json'); const wp = await r.json();
            const arc = wp.poses.filter(p=>p.arc===1), seg = wp.segs.flat(), n=arc.length;
            return [0,Math.floor(n/3),Math.floor(n*2/3),n-1].map(i=>{
                const f=app.fk(arc[i]),t=seg[i];
                return {idx:i, dist:+Math.sqrt((f.x-t[0])**2+(f.y-t[1])**2+(f.z-t[2])**2).toFixed(4)};
            });
        }""")
        print("FK 4점:", fk4)
        fk_ok = all(x['dist'] <= 1.0 for x in fk4)
        print(f"FK 합격: {'✅' if fk_ok else '❌'}")

        # 2. 기즈모 확인
        gizmo = await pg.evaluate("() => !!(window.__dzw && window.__dzw._tc && typeof window.__dzw._tc.setMode==='function')")
        print(f"기즈모: {'✅' if gizmo else '❌'}")

        # 3. 한계 마커 0건 확인
        markers = await pg.evaluate("() => (window.__dzw && window.__dzw._limitMarkers || []).length")
        print(f"한계마커: {markers}건 {'✅' if markers==0 else '❌'}")

        # 4. 카메라를 로봇 팔 근접 뷰로 설정 후 스크린샷
        await pg.evaluate("""() => {
            const app = window.__dzw;
            if (!app.orbit) return;
            // 로봇 팔 전체가 보이도록
            app.orbit.theta = -0.81;
            app.orbit.phi = 1.27;
            app.orbit.r = 4.0;
            app.orbit.tgt.set(0, 0, 0.5);
            app.updateCam();
        }""")
        await pg.wait_for_timeout(300)

        await pg.screenshot(path='final_robot.png', clip={'x':175,'y':35,'width':1000,'height':750})
        print('스크린샷 → final_robot.png')
        await br.close()

asyncio.run(main())
