#!/usr/bin/env bash
# Install systemd unit for POG422 listen-only collector (no Ethernet bridge).
#
# Usage (on Pi, after deploy):
#   sudo env FIXTURE_POS=1 bash install_collector_service.sh
#   sudo bash set_ethergold_role.sh listen
#
# Stops ethergold.service (bridge) if present and installs ethergold-collector.service.
# Field OTA / log_offload: sync/install_uartd_persist_dropin.sh writes User=topbox
# + KillMode=process and restarts this unit only if MainPID is not topbox.

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

set -euo pipefail

POS="${FIXTURE_POS:-1}"
if ! [[ "${POS}" =~ ^[1-9][0-9]?$ ]]; then
  echo "FATAL: FIXTURE_POS must be 1..99 (internal id); leave unset for default 1" >&2
  exit 1
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=ethergold_field_env.sh
source "${SCRIPT_DIR}/ethergold_field_env.sh"
if [[ -f "${SCRIPT_DIR}/../sync/ethergold_paths.sh" ]]; then
  # shellcheck source=../sync/ethergold_paths.sh
  source "${SCRIPT_DIR}/../sync/ethergold_paths.sh"
elif [[ -f "${SCRIPT_DIR}/../../sync/ethergold_paths.sh" ]]; then
  # shellcheck source=../../sync/ethergold_paths.sh
  source "${SCRIPT_DIR}/../../sync/ethergold_paths.sh"
else
  # shellcheck source=/dev/null
  source "${HOME}/EtherGold/sync/ethergold_paths.sh"
fi

SUP_LOG="${ETHERGOLD_LOGS}/supervisor.log"
LISTEN_SUP="${ETHERGOLD_DAEMON}/ethergold_listen_supervisor.py"
if [[ ! -f "${LISTEN_SUP}" ]]; then
  LISTEN_SUP="${ETHERGOLD_DAEMON}/fixture_listen_supervisor.py"
fi

ethergold_migrate_legacy_paths
sudo mkdir -p "${ETHERGOLD_ETC}" "${ETHERGOLD_VAR}" "${ETHERGOLD_LOGS}"

# Merge listen keys. Do not wipe inject=0 / CHANNEL=both / FIELD_PROFILE.
CHAN="${CHANNEL:-}"
ENV_TMP="$(mktemp)"
python3 - "${ETHERGOLD_ENV_FILE}" "${POS}" "${CHAN}" <<'PY' >"${ENV_TMP}"
from pathlib import Path
import sys
path = Path(sys.argv[1])
pos = sys.argv[2]
chan_arg = sys.argv[3].strip()
keys = {}
order = []
if path.exists():
    for line in path.read_text(encoding="utf-8", errors="replace").splitlines():
        if not line.strip() or line.lstrip().startswith("#") or "=" not in line:
            continue
        k, _, v = line.partition("=")
        k = k.strip()
        if k not in keys:
            order.append(k)
        keys[k] = v.strip()
keys["FIXTURE_POS"] = pos
if chan_arg:
    keys["CHANNEL"] = chan_arg
else:
    keys.setdefault("CHANNEL", "both")
keys.setdefault("POG422_UARTD", "1")
keys.setdefault("POG422_UARTD_INJECT", "0")
keys.setdefault("FIXTURE_STATUS_LED", "1")
keys.setdefault("FIELD_PROFILE", "listen_ohd")
keys.setdefault("ETHERGOLD_CURRENT_GAME_IPC", "write")
for k in (
    "FIXTURE_POS",
    "CHANNEL",
    "POG422_UARTD",
    "POG422_UARTD_INJECT",
    "FIXTURE_STATUS_LED",
    "FIELD_PROFILE",
    "ETHERGOLD_CURRENT_GAME_IPC",
):
    if k not in order:
        order.append(k)
sys.stdout.write("".join(f"{k}={keys[k]}\n" for k in order if k in keys))
PY
sudo cp "${ENV_TMP}" "${ETHERGOLD_ENV_FILE}"
sudo chmod 644 "${ETHERGOLD_ENV_FILE}"
rm -f "${ENV_TMP}"
echo "ETHERGOLD_ROLE=listen" | sudo tee "${ETHERGOLD_ROLE_FILE}" >/dev/null

ethergold_stop_unit "${ETHERGOLD_UNIT}"
ethergold_stop_unit "${ETHERGOLD_UNIT_LEGACY}"

sudo tee "/etc/systemd/system/${ETHERGOLD_COLLECTOR_UNIT}" >/dev/null <<EOF
[Unit]
Description=EtherGold POG422 collector (listen-only)
After=local-fs.target systemd-udev-settle.service
StartLimitIntervalSec=0

[Service]
Type=notify
NotifyAccess=main
WatchdogSec=60
User=topbox
Group=topbox
SupplementaryGroups=dialout gpio
EnvironmentFile=${ETHERGOLD_ENV_FILE}
EnvironmentFile=-${ETHERGOLD_ROLE_FILE}
Environment=ETHERGOLD_ROOT=${ETHERGOLD_ROOT}
Environment=ETHERGOLD_BRIDGE=${ETHERGOLD_BRIDGE}
Environment=ETHERGOLD_DAEMON=${ETHERGOLD_DAEMON}
Environment=ETHERGOLD_LOGS=${ETHERGOLD_LOGS}
Environment=ETHERGOLD_DISABLE_FILE=${ETHERGOLD_DISABLE_FILE}
Environment=ETHERGOLD_CURRENT_GAME_IPC=write
Environment=HOME=/home/topbox
WorkingDirectory=${ETHERGOLD_DAEMON}
ExecStart=/usr/bin/python3 ${LISTEN_SUP} --fixture-pos \$FIXTURE_POS --log ${SUP_LOG}
Restart=always
RestartSec=5
# uartd must outlive this unit. Default KillMode=control-group SIGKILLs
# pog422_uartd after TimeoutStopSec and wedges the XR USB driver.
KillMode=process
TimeoutStopSec=15
Environment=ETHERGOLD_UARTD_PERSIST=1
Environment=ETHERGOLD_UARTD_ALLOW_SIGKILL=0

[Install]
WantedBy=multi-user.target
EOF

sudo ln -sfn "${ETHERGOLD_COLLECTOR_UNIT}" "/etc/systemd/system/${ETHERGOLD_COLLECTOR_UNIT_LEGACY}" 2>/dev/null || true

if [[ -f "${SCRIPT_DIR}/install_cpu_affinity.sh" ]]; then
  sudo bash "${SCRIPT_DIR}/install_cpu_affinity.sh" || true
fi

sudo systemctl daemon-reload
sudo systemctl enable "${ETHERGOLD_COLLECTOR_UNIT}"
sudo rm -f "${ETHERGOLD_DISABLE_FILE}"
sudo systemctl restart "${ETHERGOLD_COLLECTOR_UNIT}"
echo "Installed and started ${ETHERGOLD_COLLECTOR_UNIT}"
systemctl status "${ETHERGOLD_COLLECTOR_UNIT}" --no-pager || true
