"""AR용 모델 변환 — 태블릿에 올릴 수 있는 크기로 줄여 GLB로 내보낸다.

원본 OBJ는 SketchUp이 내보낸 ASCII라 정반이 43MB/61만면 → 모바일 로드 불가.
결과물(.glb)은 .gitignore 대상이므로 필요할 때 이 스크립트로 다시 만든다.

    python 06_GEOMETRY/make_ar_assets.py

정반 감축은 21.6만면에서 하한에 걸린다. SketchUp이 부품마다 메시를 분리
내보내 조각 경계를 넘는 정점 병합이 불가능하기 때문. 태블릿 구동에는
충분하므로 목표치(4만)에 미달해도 그대로 쓴다.
"""
import os
import sys

import trimesh

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
OUT_DIR = os.path.join(ROOT, "assets_ar")

# (원본, 결과, 감축목표면수) — None이면 감축 없이 GLB 변환만
TARGETS = [
    (os.path.join("자료", "설우정반 2차.obj"), "jeonban_ar.glb", 40000),
    ("knuckle.obj", "knuckle_ar.glb", None),
]


def convert(src_rel, out_name, face_target):
    src = os.path.join(ROOT, src_rel)
    if not os.path.exists(src):
        print(f"  건너뜀 (원본 없음): {src_rel}")
        return False

    mesh = trimesh.load(src, force="mesh")
    before = len(mesh.faces)
    mesh.merge_vertices()

    if face_target and before > face_target:
        mesh = mesh.simplify_quadric_decimation(face_count=face_target)

    out = os.path.join(OUT_DIR, out_name)
    mesh.export(out)
    mb = os.path.getsize(out) / 1048576
    print(f"  {out_name}: {before:,}면 -> {len(mesh.faces):,}면 | {mb:.2f} MB")
    return True


def main():
    os.makedirs(OUT_DIR, exist_ok=True)
    print(f"AR 자산 생성 -> {OUT_DIR}")
    ok = sum(convert(*t) for t in TARGETS)
    if not ok:
        print("생성된 자산 없음", file=sys.stderr)
        return 1
    return 0


if __name__ == "__main__":
    sys.exit(main())
