#!/usr/bin/env bash
# Remove Brett gpio7low.service stack (conflicts with POG422 1F RS485 auto on GPIO7).
#
# Uninstalls:
#   /etc/systemd/system/gpio7low.service
#   /etc/udev/rules.d/99-ttyxrusb1.rules
#   ~/bridge/gpio7low.py (optional — default: remove)
#
# Run as topbox (not root). sudo used for system files only.
#
# Usage:
#   bash remove_gpio7low.sh
#   bash remove_gpio7low.sh --keep-script   # leave ~/bridge/gpio7low.py on disk

set -euo pipefail

if grep -q $'\r' "${BASH_SOURCE[0]}" 2>/dev/null; then
  sed -i 's/\r$//' "${BASH_SOURCE[0]}"
  exec bash "${BASH_SOURCE[0]}" "$@"
fi

KEEP_SCRIPT=0
for arg in "$@"; do
  case "$arg" in
    --keep-script) KEEP_SCRIPT=1 ;;
    -h|--help)
      echo "Usage: $0 [--keep-script]"
      exit 0
      ;;
    *)
      echo "Unknown option: $arg" >&2
      exit 1
      ;;
  esac
done

if [[ "${EUID}" -eq 0 ]]; then
  echo "FATAL: run as topbox, not root (script uses sudo where needed)" >&2
  exit 1
fi

UNIT_NAME="gpio7low.service"
UNIT_PATH="/etc/systemd/system/${UNIT_NAME}"
UDEV_RULE="/etc/udev/rules.d/99-ttyxrusb1.rules"
SCRIPT_PATH="${HOME}/bridge/gpio7low.py"
BACKUP_DIR="${HOME}/bridge/removed-gpio7low-$(date -u +%Y%m%dT%H%M%SZ)"

echo "=== Remove gpio7low (POG422 RS485 auto uses GPIO7 from UART shifter) ==="

if systemctl list-unit-files "${UNIT_NAME}" 2>/dev/null | grep -q "${UNIT_NAME}"; then
  echo "Stopping ${UNIT_NAME}..."
  sudo systemctl stop "${UNIT_NAME}" 2>/dev/null || true
  echo "Disabling ${UNIT_NAME}..."
  sudo systemctl disable "${UNIT_NAME}" 2>/dev/null || true
  echo "Masking ${UNIT_NAME} (blocks udev SYSTEMD_WANTS until unit file removed)..."
  sudo systemctl mask "${UNIT_NAME}" 2>/dev/null || true
else
  echo "NOTE: ${UNIT_NAME} not in systemctl list-unit-files"
fi

if [[ -f "${UNIT_PATH}" ]]; then
  echo "Removing ${UNIT_PATH}..."
  sudo rm -f "${UNIT_PATH}"
else
  echo "NOTE: ${UNIT_PATH} not present"
fi

# Unmask after file removed so systemd does not keep a stale mask entry.
sudo systemctl unmask "${UNIT_NAME}" 2>/dev/null || true

if [[ -f "${UDEV_RULE}" ]]; then
  if grep -q 'gpio7low' "${UDEV_RULE}" 2>/dev/null; then
    echo "Removing udev rule ${UDEV_RULE}..."
    sudo rm -f "${UDEV_RULE}"
  else
    echo "NOTE: ${UDEV_RULE} exists but does not mention gpio7low — left in place"
  fi
else
  echo "NOTE: ${UDEV_RULE} not present"
fi

if [[ -f "${SCRIPT_PATH}" ]]; then
  if [[ "${KEEP_SCRIPT}" -eq 1 ]]; then
    echo "Keeping ${SCRIPT_PATH} (--keep-script)"
  else
    mkdir -p "${BACKUP_DIR}"
    echo "Moving ${SCRIPT_PATH} -> ${BACKUP_DIR}/"
    mv "${SCRIPT_PATH}" "${BACKUP_DIR}/gpio7low.py"
    echo "Backup: ${BACKUP_DIR}/gpio7low.py"
  fi
else
  echo "NOTE: ${SCRIPT_PATH} not present"
fi

echo "Reloading systemd + udev..."
sudo systemctl daemon-reload
sudo systemctl reset-failed "${UNIT_NAME}" 2>/dev/null || true
sudo udevadm control --reload-rules
sudo udevadm trigger

echo
echo "=== Verify ==="
if systemctl status "${UNIT_NAME}" 2>&1 | head -3; then
  :
fi
echo "---"
systemctl is-enabled "${UNIT_NAME}" 2>&1 || true
systemctl is-active "${UNIT_NAME}" 2>&1 || true
[[ -f "${UNIT_PATH}" ]] && echo "WARN: ${UNIT_PATH} still exists" >&2 || echo "OK: unit file removed"
[[ -f "${UDEV_RULE}" ]] && echo "WARN: ${UDEV_RULE} still exists" >&2 || echo "OK: udev rule removed"
if [[ -f "${SCRIPT_PATH}" ]]; then
  echo "NOTE: ${SCRIPT_PATH} still on disk"
else
  echo "OK: gpio7low.py not in ~/bridge/"
fi

echo
echo "Done. Replug hat USB or reboot if ttyXRUSB was open during removal."
echo "Then: bash verify_driver.sh  (in this directory)"
