#!/usr/bin/env bash
# Ensure /dev/ttyXRUSB* exist (modprobe + rebind from ttyUSB* if needed).
# Used by run_bridge.sh / hat_fixture_*.sh after install_pi or before fixture start.
set -euo pipefail

if grep -q $'\r' "${BASH_SOURCE[0]}" 2>/dev/null; then
  _tmp="/tmp/_ensure_tty_xrusb_$$.sh"
  sed 's/\r$//' "${BASH_SOURCE[0]}" > "${_tmp}"
  chmod +x "${_tmp}"
  exec bash "${_tmp}" "$@"
fi

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REBIND="${ROOT}/xr-usb-serial-pog422/pog422_rebind_xr21.sh"
MOD="xr_usb_serial_common"

has_tty_xrusb() {
  shopt -s nullglob
  local devs=(/dev/ttyXRUSB*)
  shopt -u nullglob
  ((${#devs[@]} > 0))
}

wait_tty_xrusb() {
  local i
  for i in $(seq 1 10); do
    has_tty_xrusb && return 0
    sleep 0.5
  done
  return 1
}

recover_tty_xrusb() {
  if ! lsmod | grep -q "^${MOD}"; then
    echo "  loading ${MOD}..." >&2
    sudo modprobe "${MOD}" 2>/dev/null || true
  fi

  if [[ -f "${REBIND}" ]]; then
    echo "  rebind Exar hat → cdc_xr_usb_serial..." >&2
    sudo bash "${REBIND}" 2>&1 || true
  fi

  sudo udevadm trigger --subsystem-match=tty 2>/dev/null || true
  sudo udevadm settle --timeout=5 2>/dev/null || true
}

if has_tty_xrusb; then
  exit 0
fi

echo "WARN: /dev/ttyXRUSB* not found — attempting recovery..." >&2
recover_tty_xrusb

if wait_tty_xrusb; then
  echo "OK: $(ls /dev/ttyXRUSB* | tr '\n' ' ')" >&2
  exit 0
fi

echo "FATAL: /dev/ttyXRUSB* still missing" >&2
echo "  lsusb Exar hat:     lsusb | grep -i 04e2 || echo '    (not seen)'" >&2
echo "  wrong driver nodes: ls /dev/ttyUSB* 2>/dev/null || echo '    (none)'" >&2
echo "  module in RAM:      lsmod | grep xr_usb_serial || echo '    (not loaded)'" >&2
echo "  driver check:       bash ${ROOT}/xr-usb-serial-pog422/verify_driver.sh" >&2
echo "  install / reload:   cd ${ROOT}/xr-usb-serial-pog422 && bash install_pi.sh" >&2
echo "  then replug hat USB 5s or: sudo reboot" >&2
exit 1
