#!/usr/bin/env python3
"""Send a raw APDU (hex) to whatever app is currently open on a connected Ledger.

Usage:
  ./scripts/send-apdu E005010015058000002C8000374F800000000000000000000000

Or pipe:
  echo E005010015058000002C8000374F800000000000000000000000 | ./scripts/send-apdu
"""
import sys

from ledgerwallet.transport import enumerate_devices


def main() -> int:
    if len(sys.argv) > 1:
        hex_apdu = sys.argv[1]
    else:
        hex_apdu = sys.stdin.read().strip()
    hex_apdu = hex_apdu.replace(" ", "").replace("\n", "")
    if not hex_apdu:
        print("usage: send-apdu <hex-apdu>", file=sys.stderr)
        return 2
    apdu = bytes.fromhex(hex_apdu)

    devices = enumerate_devices()
    if not devices:
        print("no Ledger device found", file=sys.stderr)
        return 1
    transport = devices[0]
    transport.open()
    try:
        print(f"-> {apdu.hex().upper()}")
        # 60s timeout to give the user time to confirm on-device.
        response = transport.exchange(apdu, timeout=60000)
        if len(response) < 2:
            print(f"<- short response: {response.hex().upper()}")
            return 1
        data, sw = response[:-2], int.from_bytes(response[-2:], "big")
        print(f"<- sw={sw:04x} data={data.hex().upper()}  ({len(data)} bytes)")
    finally:
        transport.close()
    return 0 if response[-2:] == b"\x90\x00" else 1


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