import asyncio
from playwright.async_api import async_playwright

JS = """
() => {
    const app = window.__dzw;
    if(!app) return {ok:false,err:'no app'};
    const f = app.frameEl;
    const vp = app.vpEl;
    const fr = f ? f.getBoundingClientRect() : {width:0,height:0,left:0,top:0};
    const vr = vp ? vp.getBoundingClientRect() : {width:0,height:0};
    // 로고 글자 크기 (19px 텍스트)
    let logoH = 0;
    document.querySelectorAll('span').forEach(el => {
        if(el.textContent.trim()==='DOZIKWORKS') logoH = el.getBoundingClientRect().height|0;
    });
    let mc=0;
    if(app._robotGrp) app._robotGrp.traverse(function(o){if(o.isMesh)mc++;});
    const arc=(app._csvPoses||[]).filter(function(p){return p.arc===1;});
    const seg=[].concat.apply([],app._weldSegs||[]);
    const n=arc.length; let fkMax=0;
    [0,Math.floor(n/3),Math.floor(n*2/3),n-1].forEach(function(i){
        var fk=app.fk(arc[i]),t=seg[i]||[0,0,0];
        var d=Math.sqrt((fk.x-t[0])*(fk.x-t[0])+(fk.y-t[1])*(fk.y-t[1])+(fk.z-t[2])*(fk.z-t[2]));
        if(d>fkMax)fkMax=d;
    });
    var jArr=app.state.joints;
    var jVals=Array.isArray(jArr)&&Array.isArray(jArr[1])?jArr[1]:null;
    var home=[-0.12,-63.80,-36.73,0.01,-90.97,-5.53];
    var isHome=jVals&&home.every(function(v,i){return Math.abs(jVals[i]-v)<0.05;});
    // JBI 패널이 화면 안에 있는지 (bottom이 viewport 높이 이하)
    var jbiEls = document.querySelectorAll('[style*="height:198px"]');
    var jbiVisible = false;
    jbiEls.forEach(function(el){
        var r2 = el.getBoundingClientRect();
        if(r2.bottom <= window.innerHeight + 1) jbiVisible = true;
    });
    return {ok:true,
        fw:fr.width|0, fh:fr.height|0, fl:fr.left|0,
        vw:vr.width|0, vh:vr.height|0,
        logoH:logoH,
        mc:mc, fkMax:+(fkMax.toFixed(4)),
        gizmo:!!(app._tc&&typeof app._tc.setMode==='function'),
        markers:(app._limitMarkers||[]).length,
        isHome:!!isHome,
        jbiVisible:jbiVisible,
        scale:app._scale};
}
"""

async def capture(width, height, filename):
    async with async_playwright() as p:
        br = await p.chromium.launch(headless=True)
        pg = await br.new_page()
        await pg.set_viewport_size({'width': width, 'height': height})
        errors = []
        pg.on('console', lambda m: errors.append(m.text) if m.type == 'error' else None)
        pg.on('pageerror', lambda e: errors.append(str(e)))
        await pg.goto('http://localhost:8090/DOZIKWORKS_OS_v4_pathcreate.dc.html')
        await pg.wait_for_timeout(18000)

        r = await pg.evaluate(JS)

        print(f'=== {width}x{height} ===')
        if not r.get('ok'):
            print('ERROR:', r)
            await br.close()
            return None
        print(f'프레임:        {r["fw"]}x{r["fh"]}  left={r["fl"]}')
        print(f'3D 뷰포트:     {r["vw"]}x{r["vh"]}')
        print(f'로고 글자 높이: {r["logoH"]}px  (scale 없으면 1536·1920 둘다 같아야)')
        print(f'_scale:        {r["scale"]}')
        print(f'로봇 메시:     {r["mc"]}개  {"✅" if r["mc"]<200 else "❌"}')
        print(f'홈 자세:       {"✅" if r["isHome"] else "❌"}')
        print(f'FK:            {r["fkMax"]}mm  {"✅" if r["fkMax"]<=1.0 else "❌"}')
        print(f'기즈모:        {"✅" if r["gizmo"] else "❌"}')
        print(f'JBI 패널 안잘림: {"✅" if r["jbiVisible"] else "❌ 잘림"}')
        print(f'콘솔 에러:     {len(errors)}건  {"✅" if len(errors)==0 else "❌"}')

        await pg.evaluate("""
() => {
    var app=window.__dzw;
    if(app&&app.orbit){app.orbit.theta=-0.81;app.orbit.phi=1.27;app.orbit.r=4.0;
    if(app.orbit.tgt)app.orbit.tgt.set(0,0,0.5);if(app.updateCam)app.updateCam();}
}""")
        await pg.wait_for_timeout(400)
        await pg.screenshot(path=filename)
        print(f'스크린샷 → {filename}')
        await br.close()
        return r

async def main():
    r1 = await capture(1536, 1024, 'before_1536.png')
    print()
    r2 = await capture(1920, 1080, 'after_1920.png')
    if r1 and r2:
        print()
        print('=== 전후 비교 ===')
        print(f'3D 뷰포트 폭:  {r1["vw"]}px → {r2["vw"]}px  ({"✅ 넓어짐" if r2["vw"]>r1["vw"] else "❌"})')
        print(f'글자 높이:     {r1["logoH"]}px → {r2["logoH"]}px  ({"✅ 동일(scale 없음)" if r1["logoH"]==r2["logoH"] else "❌ 변함"})')
        print(f'_scale:        {r1["scale"]} → {r2["scale"]}  ({"✅ 둘다 1" if r1["scale"]==1 and r2["scale"]==1 else "❌"})')

asyncio.run(main())
