# Flash latest.beyondfw (0.4.3). Enter bootloader from app, retry-flash (known
# code-46 first-attempt quirk), verify 0.4.3. AppImage-only: bootloader stays intact.
import sys, os, time
QBU = r"C:\Users\decid\Documents\projects\quick-beyond-updater"
sys.path.insert(0, QBU); os.chdir(QBU)
import hid, bs_hmd_tools as t

FW = r"C:\Users\decid\Documents\projects\beyond_synaptics\dist\latest.beyondfw"
payload = t.load_beyondfw_file(FW)
print(f"payload {len(payload[0])} bytes @ 0x{payload[1]:08X}")

def boot_path():
    for d in hid.enumerate(0x35BD, 0x4004): return d['path']
    return None
def app_path():
    for d in hid.enumerate(0x35BD, 0x0101): return d['path']
    return None

ok = False
for attempt in range(1, 6):
    bp = boot_path()
    if bp is None:
        ap = app_path()
        if ap:
            print(f"attempt {attempt}: app mode -> entering bootloader")
            try: bp = t.enter_hmd_bootloader(device_path=ap)
            except Exception as e: print("  enter_bootloader:", e)
        if bp is None:
            print(f"attempt {attempt}: no bootloader yet; wait"); time.sleep(2); continue
    print(f"attempt {attempt}: flashing")
    try:
        ok = t.update_hmd_firmware(firmware_payload=payload, bootloader_path=bp, reset_when_done=True)
        if ok: print(f"attempt {attempt}: programming OK"); break
    except Exception as e:
        print(f"attempt {attempt}: {e}"); time.sleep(1.5)

print("=== verify ===")
ver = None
for _ in range(25):
    time.sleep(1)
    ap = app_path()
    if ap:
        try:
            ver = t.get_hmd_fw_version(device_path=ap)
            if ver: break
        except Exception: pass
print("post-flash version:", ver)
sys.exit(0 if (ver and "0.4.3" in str(ver)) else 5)
