import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        br = await p.chromium.launch(headless=False)
        pg = await br.new_page()
        await pg.set_viewport_size({'width':1400,'height':900})

        errors = []
        pg.on('pageerror', lambda err: errors.append(f'PAGEERROR: {str(err)[:200]}'))
        pg.on('console', lambda msg: errors.append(f'[{msg.type}] {msg.text[:200]}') if msg.type=='error' else None)

        await pg.goto('http://localhost:8090/DOZIKWORKS_OS_v4_pathcreate.dc.html')
        print('로드 중...')
        await pg.wait_for_timeout(14000)

        real_errors = [e for e in errors if 'favicon' not in e.lower()]
        print(f'\n새 콘솔 에러 (favicon 제외): {len(real_errors)}개')
        for e in real_errors:
            print(f'  {e}')

        # 5종 값 대조 (분리 전 기준값 하드코딩)
        result = await pg.evaluate("""() => {
            const app = window.__dzw;
            if (!app) return {error: '__dzw 없음'};
            const D = window.DZW_DATA;
            return {
                DZW_DATA_loaded: typeof D,
                tcpOffset: app.tcpOffset,
                urdf_signs: (app.urdf||[]).map(u=>({a:u.a,sign:u.sign})),
                coeff_S: app.coeff && app.coeff.S,
                coeff_T: app.coeff && app.coeff.T,
                anchors_len: app.anchors && app.anchors.length,
                blocksDef_len: app.blocksDef && app.blocksDef.length,
                blocksDef_0: app.blocksDef && app.blocksDef[0],
                tcAlive: !!(app._tc && typeof app._tc.setMode === 'function'),
                fkOk: typeof app.fk === 'function',
                // DZW_DATA 원본도 확인
                data_tcpOffset: D && D.tcpOffset,
                data_coeff_S: D && D.coeff && D.coeff.S
            };
        }""")
        print('\n=== 값 대조 (분리 전 기준) ===')
        print(f"  DZW_DATA 로드: {result.get('DZW_DATA_loaded')}")
        print(f"  tcpOffset: {result.get('tcpOffset')}  (기준: [-136.826, 8.192, 506.982])")
        print(f"  urdf signs: {result.get('urdf_signs')}  (기준: S/L=1, U/R/B/T=-1)")
        print(f"  coeff.S: {result.get('coeff_S')}  (기준: zero=211,ppd=1341.4,off=0.16)")
        print(f"  coeff.T: {result.get('coeff_T')}  (기준: zero=2791,ppd=454.7,off=6.14)")
        print(f"  anchors 길이: {result.get('anchors_len')}  (기준: 9)")
        print(f"  blocksDef 길이: {result.get('blocksDef_len')}  (기준: 8)")
        print(f"  blocksDef[0]: {result.get('blocksDef_0')}  (기준: HOME s=0 e=2)")
        print(f"  기즈모(_tc): {result.get('tcAlive')}")
        print(f"  fk 함수: {result.get('fkOk')}")

        # FK 4점 검증
        fk_result = await pg.evaluate("""async () => {
            const app = window.__dzw;
            const r = await fetch('/weld_path.json');
            const wp = await r.json();
            const arcPoses = wp.poses.filter(p => p.arc === 1);
            const segFlat = wp.segs.flat();
            if (arcPoses.length !== segFlat.length)
                return {error: `불일치: ${arcPoses.length} vs ${segFlat.length}`};
            const n = arcPoses.length;
            return [0, Math.floor(n/3), Math.floor(n*2/3), n-1].map(i => {
                const fkr = app.fk(arcPoses[i]);
                const t = segFlat[i];
                const dist = Math.sqrt((fkr.x-t[0])**2+(fkr.y-t[1])**2+(fkr.z-t[2])**2);
                return {idx:i, dist:+dist.toFixed(4), pass:dist<=1.0};
            });
        }""")
        expected = [0.0013, 0.0015, 0.0011, 0.0016]
        print('\n=== FK 4점 오차 ===')
        if isinstance(fk_result, list):
            all_pass = all(r['pass'] for r in fk_result)
            for i, r in enumerate(fk_result):
                match = '✅' if r['pass'] else '❌'
                same = '=' if r['dist'] == expected[i] else f"≠{expected[i]}"
                print(f"  {match} idx={r['idx']} {r['dist']}mm ({same})")
            print(f"  최종: {'✅ 합격' if all_pass else '❌ 불합격'}")
        else:
            print(' ', fk_result)

        await pg.screenshot(path='data_split_verify.png')
        print('\n스크린샷 → data_split_verify.png')
        await br.close()

asyncio.run(main())
