import asyncio
from playwright.async_api import async_playwright

JS_OVERLAY = (
    "async () => {"
    "const T=window.THREE, grp=window.__dzw._grp;"
    "const r=await fetch('jeonban.obj'); const txt=await r.text();"
    "const lines=txt.split('\\n'), vBuf=[], posArr=[];"
    "for(const line of lines){"
    "const p=line.trim().split(' ');"
    "if(p[0]==='v'){ vBuf.push(parseFloat(p[1]),parseFloat(p[2]),parseFloat(p[3])); }"
    "else if(p[0]==='f'){"
    "const verts=[];"
    "for(let i=1;i<p.length;i++){ const sp=p[i].split('/'); verts.push((parseInt(sp[0])-1)*3); }"
    "for(let i=1;i<verts.length-1;i++){"
    "for(const vi of [verts[0],verts[i],verts[i+1]])"
    "posArr.push(vBuf[vi],vBuf[vi+1],vBuf[vi+2]);"
    "}"
    "}"
    "}"
    "const g=new T.BufferGeometry();"
    "g.setAttribute('position',new T.BufferAttribute(new Float32Array(posArr),3));"
    "g.computeVertexNormals();"
    "const m=new T.Mesh(g,new T.MeshPhongMaterial({color:0xff0000,transparent:true,opacity:0.7,wireframe:true}));"
    "m.raycast=()=>{};"
    "grp.add(m);"
    "return 'overlay_done';"
    "}"
)

# 새 정반 mesh Z 이동 (grp 자식 중 마지막이 새 정반)
def JS_MOVE_Z(dz):
    return (
        f"(()=>{{"
        f"const grp=window.__dzw._grp;"
        f"const children=grp.children;"
        f"for(let i=0;i<children.length;i++){{"
        f"if(children[i].isMesh && !children[i].geometry.isBufferGeometry) continue;"
        f"if(children[i].material && children[i].material.color && children[i].material.color.getHex()===0x0d1a22){{"
        f"children[i].position.z+={dz};"
        f"console.log('moved z by {dz}, now='+children[i].position.z);"
        f"}}"
        f"}}"
        f"}})()"
    )

async def main():
    async with async_playwright() as p:
        br = await p.chromium.launch(channel='msedge', headless=False, args=['--start-maximized'])
        ctx = await br.new_context(no_viewport=True)
        pg = await ctx.new_page()
        await pg.goto('http://localhost:8090/DOZIKWORKS_OS_v5_locked.dc.html')
        print('로딩 45초...')
        await pg.wait_for_timeout(45000)
        r = await pg.evaluate(JS_OVERLAY)
        print('오버레이:', r)
        await pg.wait_for_timeout(1000)

        # 정면 카메라
        await pg.evaluate("(()=>{ const a=window.__dzw; a.orbit.phi=1.2; a.orbit.theta=-1.57; a.orbit.r=7; a.updateCam(); })()")
        await pg.wait_for_timeout(500)

        print('브라우저 열려있습니다. 새 정반을 Z방향으로 올리겠습니다.')
        print('Enter 누를 때마다 50mm씩 올립니다. q+Enter로 종료.')

        total = 0
        while True:
            cmd = input(f'현재 누적 이동: {total}mm. [Enter=+50mm / q=종료]: ')
            if cmd.strip().lower() == 'q':
                break
            # 50mm 올리기 (grp scale=0.001이므로 mm 단위)
            await pg.evaluate(f"(()=>{{ const grp=window.__dzw._grp; grp.children.forEach(c=>{{ if(c.isMesh && c.material && c.material.color && c.material.color.getHex()===0x0d1a22){{ c.position.z+=50; }} }}); }})()")
            total += 50
            print(f'+50mm 이동 (총 {total}mm)')
            await pg.screenshot(path=f'align_z{total}.png')
            print(f'스크린샷: align_z{total}.png')

        print(f'최종 이동량: {total}mm')
        print(f'코드에 적용할 OFS_Z = -1022.8 + {total} = {-1022.8 + total}')
        await br.close()

asyncio.run(main())
