"""
old_check.html (27831c2, 2026-06-24 16:05 — v4 최초 커밋) 실제로 띄워서:
1. 4방향 스크린샷 — 팔 연결 여부 눈으로 확인
2. 각 관절 ang.rz + STL 중심 world 위치 측정
3. 현재(깨진) 버전과 수치 비교
"""
import asyncio, math
from playwright.async_api import async_playwright

JS_MEASURE = """
() => {
    var app = window.__dzw;
    var T = app && app._T;
    if(!app || !T) return {err: 'no app'};
    app._grp.updateMatrixWorld(true);

    function wpos(obj){
        var v=new T.Vector3(); obj.getWorldPosition(v);
        return [+(v.x*1000).toFixed(1),+(v.y*1000).toFixed(1),+(v.z*1000).toFixed(1)];
    }

    var gj=app.gj, out={angRz:{}, pivWorld:{}, stlBB:{}, hasSGN:false, joints:{}};
    var src=(app.poseRobot||'').toString();
    out.hasSGN = src.includes('SGN');

    ['S','L','U','R','B','T'].forEach(function(a){
        var ag=gj&&gj[a]; if(!ag)return;
        out.angRz[a]   = +(ag.rotation.z*180/Math.PI).toFixed(2);
        out.pivWorld[a]= wpos(ag.parent);

        var box=new T.Box3(), has=false;
        ag.children.forEach(function(c){
            if(c.isMesh&&c.geometry&&c.geometry.attributes&&c.geometry.attributes.position){
                var mb=new T.Box3(); mb.setFromObject(c); box.union(mb); has=true;
            }
        });
        if(has){ var cen=new T.Vector3(); box.getCenter(cen);
            out.stlBB[a]=[+(cen.x*1000).toFixed(1),+(cen.y*1000).toFixed(1),+(cen.z*1000).toFixed(1)]; }
    });

    // TCP FK 값
    var jArr=app.state&&app.state.joints;
    var jVals=Array.isArray(jArr)&&Array.isArray(jArr[1])?jArr[1]:null;
    if(jVals){ var j={S:jVals[0],L:jVals[1],U:jVals[2],R:jVals[3],B:jVals[4],T:jVals[5]};
        try{ out.fk=app.fk(j); }catch(e){} }

    return out;
}
"""

CAMERAS = [
    ('FRONT', -math.pi/2,  math.pi/2*0.6, 3.5),
    ('RIGHT',  0.0,         math.pi/2*0.6, 3.5),
    ('LEFT',   math.pi,     math.pi/2*0.6, 3.5),
    ('TOP',   -math.pi/2,   0.15,          4.0),
]

JS_CAM = """(a)=>{
    var app=window.__dzw; if(!app||!app.orbit)return;
    app.orbit.theta=a.theta; app.orbit.phi=a.phi; app.orbit.r=a.r;
    if(app.orbit.tgt) app.orbit.tgt.set(0,0,0.5);
    if(app.updateCam) app.updateCam();
}"""

async def run(url, label, prefix):
    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(url)
        await pg.wait_for_timeout(22000)  # STL 충분히 대기
        r = await pg.evaluate(JS_MEASURE)
        shots = {}
        for (name,theta,phi,rv) in CAMERAS:
            await pg.evaluate(JS_CAM, {'theta':theta,'phi':phi,'r':rv})
            await pg.wait_for_timeout(350)
            fn = f'{prefix}_{name.lower()}.png'
            await pg.screenshot(path=fn)
            shots[name] = fn
        await br.close()
    return r, shots

async def main():
    BASE = 'http://localhost:8090'
    OLD  = f'{BASE}/old_check.html'

    print('=== OLD(27831c2, 2026-06-24 16:05) 측정 중... ===')
    r_old, shots_old = await run(OLD, 'OLD', 'oldcheck')

    if 'err' in r_old:
        print('ERROR:', r_old); return

    print(f'\nhasSGN(SGN 있으면 sign 수정 후): {r_old["hasSGN"]}')
    print()
    print(f"{'링크':<4}  {'ang.rz':>9}  {'piv world(mm)':>35}  {'STL 중심(mm)'}")
    print('-'*90)
    for a in ['S','L','U','R','B','T']:
        rz  = r_old['angRz'].get(a,'?')
        piv = r_old['pivWorld'].get(a,'?')
        stl = r_old['stlBB'].get(a,'?')
        print(f"  {a}   {str(rz):>9}°   {str(piv):>35}   {stl}")

    if r_old.get('fk'):
        fk = r_old['fk']
        print(f'\nFK TCP: X={fk["x"]:.2f}  Y={fk["y"]:.2f}  Z={fk["z"]:.2f} mm')

    print('\n4방향 스크린샷:')
    for name, fn in shots_old.items():
        print(f'  {name} → {fn}')

asyncio.run(main())
