#!/usr/bin/env bash
# HAT LED1 (EtherGold / BCM2) helper for shell POST before Python claims the pin.
#
#   source hat_status_led.sh
#   hat_led_phase 2
#   hat_led_stop          # release GPIO before exec python bridge
#
# Disable: HAT_STATUS_LED=0

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  echo "FATAL: source hat_status_led.sh (do not execute)" >&2
  exit 1
fi

_HAT_LED_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_HAT_LED_BCM="${EG_STATUS_LED_GPIO:-2}"
_HAT_LED_PID_FILE="${HAT_STATUS_LED_PID_FILE:-/tmp/hat_status_led_eg.pid}"

hat_led_enabled() {
  case "${HAT_STATUS_LED:-1}" in
    0|false|FALSE|no|NO|off|OFF) return 1 ;;
  esac
  return 0
}

hat_led_stop() {
  local pid
  if [[ -f "${_HAT_LED_PID_FILE}" ]]; then
    pid="$(cat "${_HAT_LED_PID_FILE}" 2>/dev/null || true)"
    if [[ -n "${pid}" ]] && kill -0 "${pid}" 2>/dev/null; then
      kill "${pid}" 2>/dev/null || true
      wait "${pid}" 2>/dev/null || true
    fi
    rm -f "${_HAT_LED_PID_FILE}" 2>/dev/null || true
  fi
  # Best-effort: any leftover CLI holders for this BCM.
  pkill -f "hat_status_led.py --bcm ${_HAT_LED_BCM}" 2>/dev/null || true
}

hat_led_phase() {
  local n="${1:-1}"
  hat_led_enabled || return 0
  hat_led_stop
  if [[ ! -f "${_HAT_LED_ROOT}/hat_status_led.py" ]]; then
    return 0
  fi
  nohup python3 "${_HAT_LED_ROOT}/hat_status_led.py" --bcm "${_HAT_LED_BCM}" --loop phase "${n}" \
    >/dev/null 2>&1 &
  echo $! >"${_HAT_LED_PID_FILE}"
}

hat_led_wait_tty() {
  # Phase 2 hardening: wait for /dev/ttyXRUSB* before bailing.
  local timeout_s="${1:-60}"
  local waited=0
  hat_led_phase 2
  while (( waited < timeout_s )); do
    if ls /dev/ttyXRUSB* >/dev/null 2>&1; then
      echo "hat_led: ttyXRUSB present after ${waited}s" >&2
      return 0
    fi
    sleep 1
    waited=$((waited + 1))
  done
  echo "FATAL: /dev/ttyXRUSB* not found after ${timeout_s}s" >&2
  return 1
}
