# Retry flasher: headset is already in bootloader mode (35BD:4004). Re-erase +
# program directly, retrying on transient write errors, then verify.
import sys, os, time
QBU = r"C:\Users\decid\Documents\projects\quick-beyond-updater"
sys.path.insert(0, QBU); os.chdir(QBU)
import hid
import 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(vendor_id=0x35BD, product_id=0x4004):
        return d['path']
    return None
def app_path():
    for d in hid.enumerate(vendor_id=0x35BD, product_id=0x0101):
        return d['path']
    return None

ok = False
for attempt in range(1, 5):
    bp = boot_path()
    if bp is None:
        # maybe it booted to app already; if so we're done-ish, check version
        ap = app_path()
        if ap:
            print("device in app mode; trying to re-enter bootloader")
            bp = t.enter_hmd_bootloader(device_path=ap)
        if bp is None:
            print(f"attempt {attempt}: no bootloader device; waiting"); time.sleep(2); continue
    print(f"attempt {attempt}: flashing via {bp.decode('utf-8','ignore')[:50]}")
    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(20):
    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)
print("RESULT:", "OK 0.4.1" if ver and "0.4.1" in str(ver) else f"CHECK ({ver})")
sys.exit(0 if (ver and "0.4.1" in str(ver)) else 5)
