# run_all_gate.py — 커밋 관문: 핵심 검증 일괄 실행 [CEO 지시 2026-07-18]
#   목적: "고치면 옆이 깨지는" 악순환 차단. 사람이 눌러보기 전에 기계가 전부 눌러본다.
#   사용: python run_all_gate.py          (전체 실행, 하나라도 FAIL이면 종료코드 1)
#         python run_all_gate.py --quick  (핵심 4종만)
#   커밋 훅(guard_viewer_commit.py)이 뷰어 파일 커밋 시 자동 호출.
import subprocess, sys, time, os

os.chdir(os.path.dirname(os.path.abspath(__file__)))

# (파일, 통과판정문자열, 제한초) — 판정문자열이 stdout에 있어야 통과
CORE = [
    ("_teach_flow_test.py",  "결과: PASS", 240),   # 판A/판B 기본 티칭 흐름 (등록·취소후재등록·연타차단)
    ("_teach_ui_regression_test.py", "결과: PASS", 180),  # 티칭UI 회귀 4종: 패널유지·판A이탈0·콘솔오버레이·자동티칭1클릭차단 [2026-07-20]
    ("_ar_pnp_test.py",    "결과: PASS", 240),   # AR 솔버 정답복원+왜곡보정
    ("_ar_loupe_test.py",  "결과: PASS", 180),   # AR 진입~8점~정렬 전 과정
    ("_ik_rescue_test.py", "PASS",       420),  # IK 다중시드 구조 (부하 플레이크로 240→420s)
    ("_safety_gate_test.py","PASS",      240),   # JBI 내보내기 안전관문
]
FULL = CORE + [
    ("_torch_penetration_test.py", "결과: PASS", 180),  # 토치 관통 검출 실효성
    ("_self_collision_test2.py", "결과: PASS", 180),  # 자기충돌 감시 실효성 (BASE↔U 검출)
    ("_translate_test.py",    "결과: PASS", 120),  # 번역기 — 자세수학·KUKA/ABB/CSV 산출
    ("_session_save_test.py", "PASS", 240),      # 새로고침 복원
    ("_dxf_multi_test.py",    "PASS", 240),      # DXF 다중 문서
]

def run(tests):
    fails, t0 = [], time.time()
    for f, expect, tmo in tests:
        if not os.path.exists(f):
            print(f"  [건너뜀] {f} 없음"); continue
        t1 = time.time()
        try:
            r = subprocess.run([sys.executable, f], capture_output=True, timeout=tmo)
            out = r.stdout.decode("utf-8", "replace")
            ok = expect in out
        except subprocess.TimeoutExpired:
            ok, out = False, "(시간초과)"
        mark = "✅" if ok else "❌"
        print(f"  {mark} {f}  ({time.time()-t1:.0f}s)")
        if not ok:
            fails.append(f)
            tail = "\n".join(out.strip().splitlines()[-5:])
            print("     └ 마지막 출력:\n" + "\n".join("       "+l for l in tail.splitlines()))
    print(f"\n=== 관문 결과: {'통과' if not fails else '차단'} "
          f"({len(tests)-len(fails)}/{len(tests)}, {time.time()-t0:.0f}s)")
    if not fails:   # 통과 도장 — 커밋 훅(guard_viewer_commit.py)이 15분간 인정
        open("_gate_pass.stamp", "w").write(str(time.time()))
    if fails:
        print("=== 실패:", ", ".join(fails))
        print("=== 이 상태로 커밋 금지 — 원인 수정 후 재실행")
    return 1 if fails else 0

if __name__ == "__main__":
    quick = "--quick" in sys.argv
    print(f"=== 뷰어 검증 관문 ({'핵심' if quick else '전체'}) — 8090 서버 필요 ===")
    sys.exit(run(CORE if quick else FULL))
