"""
diagnose.py — ตรวจว่าอะไรทำให้เซิร์ฟเวอร์สตาร์ทไม่ขึ้น

รัน:  python diagnose.py     (ใน venv ที่ activate แล้ว)
หรือดับเบิลคลิก diagnose.bat

พิมพ์ผลออกมาเป็นรายการชัดๆ ส่งภาพหน้าจอมาได้เลย
"""
import sys, traceback

try:
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except (AttributeError, ValueError):
    pass

LINE = "=" * 62
print(LINE)
print(" ตรวจสอบระบบสแกนป้ายทะเบียน")
print(LINE)

print(f"\nPython: {sys.version.split()[0]}  ({sys.executable})")
if not (3, 10) <= sys.version_info < (3, 13):
    print("  [FAIL] ต้องเป็น Python 3.10-3.12")

print("\n--- 1) เวอร์ชันไลบรารี ---")
problems = []
for mod, attr in [("numpy", "__version__"), ("scipy", "__version__"),
                  ("cv2", "__version__"), ("torch", "__version__"),
                  ("skimage", "__version__"), ("PIL", "__version__"),
                  ("fastapi", "__version__"), ("uvicorn", "__version__")]:
    try:
        m = __import__(mod)
        print(f"  [OK]   {mod:12} {getattr(m, attr, '?')}")
    except Exception as exc:
        print(f"  [FAIL] {mod:12} {type(exc).__name__}: {exc}")
        problems.append((mod, exc))

# ตรวจกรณีคลาสสิก: numpy 1.x ปนกับไลบรารีที่ compile มากับ numpy 2.x
try:
    import numpy
    if numpy.__version__.startswith("1."):
        print("\n  [!] numpy เป็นรุ่น 1.x — ระบบนี้ต้องใช้ 2.x")
        print("      แก้ด้วย:  pip install -U \"numpy>=2.1,<3\"")
except Exception:
    pass

print("\n--- 2) ไลบรารีหนัก (easyocr / ultralytics) ---")
for mod in ("easyocr", "ultralytics"):
    try:
        m = __import__(mod)
        print(f"  [OK]   {mod:12} {getattr(m, '__version__', '?')}")
    except Exception as exc:
        print(f"  [FAIL] {mod:12} {type(exc).__name__}: {exc}")
        problems.append((mod, exc))

print("\n--- 3) โค้ดของโปรเจกต์ ---")
for mod in ("app.config", "app.plate_utils", "app.database",
            "app.pipeline", "app.main"):
    try:
        __import__(mod)
        print(f"  [OK]   {mod}")
    except Exception as exc:
        print(f"  [FAIL] {mod}: {type(exc).__name__}: {exc}")
        traceback.print_exc()
        problems.append((mod, exc))
        break

print("\n--- 4) ไฟล์ที่ต้องมี ---")
from pathlib import Path
here = Path(__file__).resolve().parent
for rel, need in [("models", False), ("models/license_plate.pt", False),
                  (".env", False), ("../frontend/index.html", True)]:
    p = here / rel
    mark = "[OK]  " if p.exists() else ("[FAIL]" if need else "[ - ] ")
    size = f" ({p.stat().st_size/1_048_576:.1f} MB)" if p.is_file() else ""
    print(f"  {mark} {rel}{size}")

print("\n" + LINE)
if problems:
    print(f" พบปัญหา {len(problems)} จุด — ดูบรรทัด [FAIL] ด้านบน")
else:
    print(" ผ่านทั้งหมด — ลองรัน run_server.bat ได้เลย")
print(LINE)
