# _teach_flow_test.py — 판A/판B 기본 티칭 흐름 회귀 방지 [2026-07-19 CEO 질책 후 제정]
#   배경: 중복방지 수정이 "실행취소 후 재클릭"까지 차단해 기본 티칭이 죽었던 회귀.
#   판정: ①판A/판B 클릭→용접선 등록 ②실행취소 후 같은 판 재클릭→재등록 ③같은 판B 연타→추가등록 0
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 (await br.new_context()).new_page()
        await pg.set_viewport_size({'width': 1600, 'height': 900})
        logs = []
        pg.on('console', lambda m: logs.append(m.text))
        await pg.goto('http://localhost:8090/DOZIKWORKS_OS_v5_locked.dc.html')
        await pg.wait_for_timeout(12000)
        pts = await pg.evaluate("""()=>{
            const a=window.__dzw, T=window.THREE, km=a._knuckleMesh, g=km.geometry;
            const dom=a.three.rnd.domElement, r=dom.getBoundingClientRect();
            const cen=(fi)=>{ const ia=[g.index.getX(fi*3),g.index.getX(fi*3+1),g.index.getX(fi*3+2)];
                const p=new T.Vector3();
                for(const i of ia) p.add(new T.Vector3().fromBufferAttribute(g.attributes.position,i));
                p.divideScalar(3).applyMatrix4(km.matrixWorld);
                const s=p.clone().project(a.three.cam);
                return [r.left+(s.x+1)/2*r.width, r.top+(-s.y+1)/2*r.height]; };
            return {A:cen(7290), B:cen(7520)};
        }""")

        async def teach():
            await pg.evaluate("()=>DZW5_EDGEPATH.startCurveMode(window.__dzw)")
            await pg.mouse.click(*pts['A']); await pg.wait_for_timeout(400)
            await pg.evaluate("()=>DZW5_EDGEPATH.startToBMode(window.__dzw)")
            await pg.mouse.click(*pts['B']); await pg.wait_for_timeout(700)

        def segs(): return sum(1 for l in logs if 'seam→경로] ✅' in l)
        await teach(); s1 = segs()
        await pg.evaluate("()=>DZW5_EDGEPATH.undoLastSeam(window.__dzw)")
        await pg.wait_for_timeout(400)
        await teach(); s2 = segs()
        for _ in range(3):
            await pg.mouse.click(*pts['B']); await pg.wait_for_timeout(450)
        s3 = segs()
        # [2026-07-19 CEO 롤백] 연타 차단 기능 철회됨 — 기준선 판정은 ①등록 ②취소 후 재등록만
        ok = (s1 == 1 and s2 == 2)
        print({'1차등록': s1, '취소후재등록': s2, '연타후': s3})
        print()
        print('=== 결과:', 'PASS' if ok else 'FAIL')
        await br.close()
        return 0 if ok else 1

raise SystemExit(asyncio.run(main()))
