#!/usr/bin/env bash
# start-service — ensure the W1HD APRS-IS Python logger is installed and running
# Location: /var/log/direwolf/start-service
set -euo pipefail

TRACKER_DIR="/home/bbl/html/w1hd-tracker"
PY_SCRIPT="${TRACKER_DIR}/w1hd.py"
VENV_DIR="${TRACKER_DIR}/venv"
PY_BIN="${VENV_DIR}/bin/python"
PIP_BIN="${VENV_DIR}/bin/pip"
ENV_FILE="/etc/default/w1hd-logger"
UNIT_NAME="w1hd-logger.service"
UNIT_FILE="/etc/systemd/system/${UNIT_NAME}"

need_root() { [ "${EUID:-0}" -eq 0 ] || { echo "Please run with sudo/root."; exit 1; }; }
ensure_pkg() { dpkg -s "$1" >/dev/null 2>&1 || apt-get install -y "$1"; }

need_root

# 0) Sanity
if [ ! -f "$PY_SCRIPT" ]; then
  echo "ERROR: ${PY_SCRIPT} not found. Put your w1hd.py there and rerun."
  exit 1
fi

# 1) Deps
apt-get update -y
ensure_pkg python3-venv
ensure_pkg python3-pip

# 2) venv + aprslib
if [ ! -x "$PY_BIN" ]; then
  echo "==> Creating virtualenv at ${VENV_DIR}..."
  python3 -m venv "$VENV_DIR"
fi
echo "==> Ensuring aprslib in venv..."
"$PIP_BIN" -q install --upgrade pip >/dev/null
"$PIP_BIN" -q install aprslib >/dev/null

# 3) Env file (create once; edit later)
if [ ! -f "$ENV_FILE" ]; then
  echo "==> Writing default ${ENV_FILE}..."
  tee "$ENV_FILE" >/dev/null <<'EOF'
# Environment for w1hd-logger.service
APRS_CALLSIGN=W1HD
APRS_PASSCODE=27799
APRS_HOST=noam.aprs2.net
APRS_PORT=14580
APRS_FILTER=b/W1HD-9
APRS_LOGFILE=/home/bbl/html/w1hd-tracker/W1HD-9_packets.log

# App identification (two tokens after 'vers'): <APP_NAME> <APP_VER>
APRS_APPNAME=w1hd-tracker
APRS_APPVER=1.0_k1te.bradshaw@lupton.us_BuzzardsBayMA_+15088736867

# Backoff / niceness
APRS_BACKOFF_START=10
APRS_BACKOFF_MAX=600
APRS_JITTER_MAX=3.0
EOF
  chown root:root "$ENV_FILE"
  chmod 600 "$ENV_FILE"
else
  echo "==> Using existing ${ENV_FILE}"
fi

# 4) Make sure logfile path exists & is writable by bbl
LOGFILE="$(. "$ENV_FILE"; echo "${APRS_LOGFILE}")"
install -d -m 0755 -o bbl -g bbl "$(dirname "$LOGFILE")"
touch "$LOGFILE"
chown bbl:bbl "$LOGFILE"
chmod 0644 "$LOGFILE"

# 5) Systemd unit
if [ ! -f "$UNIT_FILE" ]; then
  echo "==> Creating ${UNIT_FILE}..."
  tee "$UNIT_FILE" >/dev/null <<EOF
[Unit]
Description=W1HD APRS-IS raw packet logger (aprslib)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bbl
Group=bbl
WorkingDirectory=${TRACKER_DIR}
EnvironmentFile=${ENV_FILE}
ExecStart=${PY_BIN} ${PY_SCRIPT}
Restart=always
RestartSec=5
# Hardening (keep simple so we can write under /home/bbl)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full

[Install]
WantedBy=multi-user.target
EOF
else
  echo "==> ${UNIT_FILE} already exists."
fi

# 6) Enable & (re)start Python logger
echo "==> Enabling + starting ${UNIT_NAME}…"
systemctl daemon-reload
systemctl enable --now "${UNIT_NAME}"

# 7) If the older Direwolf APRS-IS raw service exists, ensure it too
if systemctl list-unit-files --type=service | grep -q '^aprsis-w1hd9-raw.service'; then
  echo "==> Also ensuring aprsis-w1hd9-raw.service is running…"
  systemctl enable --now aprsis-w1hd9-raw.service
fi

# 8) Status
echo "==> Status (Python logger):"
systemctl --no-pager -l status "${UNIT_NAME}" || true
if systemctl list-unit-files --type=service | grep -q '^aprsis-w1hd9-raw.service'; then
  echo
  echo "==> Status (aprsis-w1hd9-raw):"
  systemctl --no-pager -l status aprsis-w1hd9-raw.service || true
fi

echo
echo "Logs (Python):  ${LOGFILE}"
echo "Follow logs:    tail -F \"${LOGFILE}\""
echo "Journal (Py):   journalctl -u ${UNIT_NAME} -f"
if systemctl list-unit-files --type=service | grep -q '^aprsis-w1hd9-raw.service'; then
  echo "Raw APRS-IS:    /var/log/direwolf/w1hd9-aprsis.raw  (plus rotated .1 / .2.gz …)"
  echo "Journal (raw):  journalctl -u aprsis-w1hd9-raw -f"
fi
