#!/usr/bin/env bash
set -Eeuo pipefail

SERVICE="batmon.service"
COOLDOWN_FILE="/run/batmon-ble-watchdog.last"
COOLDOWN_SECONDS=600
ERROR_WINDOW="5 minutes ago"
ERROR_PATTERN='org\.bluez\.Error\.InProgress|Service Discovery has not been performed yet|device .* not found|timeout waiting for|disconnected after|BleakDBusError'

now="$(date +%s)"

if [[ -f "$COOLDOWN_FILE" ]]; then
  last="$(cat "$COOLDOWN_FILE" 2>/dev/null || echo 0)"
  if (( now - last < COOLDOWN_SECONDS )); then
    exit 0
  fi
fi

errors="$(journalctl -u "$SERVICE" --since "$ERROR_WINDOW" --no-pager -o cat | grep -Eci "$ERROR_PATTERN" || true)"

if (( errors < 3 )); then
  exit 0
fi

echo "$now" > "$COOLDOWN_FILE"
logger -t batmon-ble-watchdog "Detected $errors BatMON/BLE errors; resetting BatMON and hci0-hci3"

systemctl stop "$SERVICE" || true
sleep 2

for i in 0 1 2 3; do
  btmgmt --index "$i" power off || true
done

sleep 3

for i in 0 1 2 3; do
  btmgmt --index "$i" power on || true
done

sleep 5
systemctl start "$SERVICE" || true
logger -t batmon-ble-watchdog "BatMON BLE reset completed"
