#!/usr/bin/env bash
# Installs the overdeck-collector systemd --user unit. Does NOT enable or start it —
# that is an explicit separate step the operator runs themselves.
set -euo pipefail

script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
collector_dir="$(cd "${script_dir}/../collector" && pwd)"
backend_root="${OVERDECK_BACKEND_RELEASE_ROOT:-${XDG_STATE_HOME:-$HOME/.local/state}/overdeck/backend}"
collector_current="${backend_root}/collector/current"
unit_src="${script_dir}/overdeck-collector.service"
unit_dest_dir="${HOME}/.config/systemd/user"
unit_dest="${unit_dest_dir}/overdeck-collector.service"
front_socket_src="${script_dir}/overdeck-collector-front.socket"
front_socket_dest="${unit_dest_dir}/overdeck-collector-front.socket"
front_service_src="${script_dir}/overdeck-collector-front.service"
front_service_dest="${unit_dest_dir}/overdeck-collector-front.service"
startup_boost_src="${script_dir}/overdeck-collector-startup-boost.service"
startup_boost_dest="${unit_dest_dir}/overdeck-collector-startup-boost.service"

bun_bin="$(command -v bun || true)"
if [[ -z "${bun_bin}" ]]; then
  echo "error: bun is not on PATH — install bun before running this script" >&2
  exit 1
fi

if [[ ! -x "${collector_current}/bin/start" ]]; then
  echo "error: ${collector_current}/bin/start not found — stage and seed a collector release first" >&2
  exit 1
fi

mkdir -p "${unit_dest_dir}"
front_was_enabled=false
if systemctl --user is-enabled --quiet overdeck-collector-front.service 2>/dev/null; then
  front_was_enabled=true
fi

relay_changed=true
old_relay=""
if [[ -f "${front_service_dest}" ]]; then
  old_relay="$(sed -n 's|^ExecStart=[^ ]* \([^ ]*/frontdoor/relay\.mjs\) .*|\1|p' "${front_service_dest}")"
  if [[ -n "${old_relay}" && -f "${old_relay}" ]] && cmp -s "${old_relay}" "${collector_dir}/frontdoor/relay.mjs"; then
    relay_changed=false
  fi
fi

unit_changed=true
old_node=""
if [[ -f "${front_service_dest}" ]]; then
  old_node="$(sed -n 's|^ExecStart=\([^ ]*\) .*|\1|p' "${front_service_dest}")"
  old_dir="$(sed -n 's|^ExecStart=[^ ]* \(.*\)/frontdoor/relay\.mjs .*|\1|p' "${front_service_dest}")"
  if [[ -n "${old_node}" && -n "${old_dir}" ]]; then
    normalized_old="$(sed -e "s#${old_node}#__NODE__#g" -e "s#${old_dir}#__COLLECTOR_DIR__#g" "${front_service_dest}")"
    if [[ "${normalized_old}" == "$(cat "${front_service_src}")" ]]; then unit_changed=false; fi
  fi
fi

front_rendered="$(mktemp "${unit_dest_dir}/.overdeck-collector-front.service.XXXXXX")"
trap 'rm -f "${front_rendered}"' EXIT
sed -e "s#__COLLECTOR_DIR__#${collector_dir}#g" "${front_service_src}" >"${front_rendered}"
if [[ -n "${old_node}" && "${old_node}" != __NODE__ ]]; then
  sed -i "s#__NODE__#${old_node}#g" "${front_rendered}"
fi

sed \
  -e "s#__COLLECTOR_CURRENT__#${collector_current}#g" \
  -e "s#__BUN_BIN__#${bun_bin}#g" \
  "${unit_src}" > "${unit_dest}"
install -m 0644 "${front_socket_src}" "${front_socket_dest}"
install -m 0644 "${startup_boost_src}" "${startup_boost_dest}"
if [[ ! -f "${front_service_dest}" || "${relay_changed}" == true || "${unit_changed}" == true ]]; then
  install -m 0644 "${front_rendered}" "${front_service_dest}"
fi

systemctl --user daemon-reload

if [[ "${front_was_enabled}" == true && ( "${relay_changed}" == true || "${unit_changed}" == true ) ]]; then
  systemctl --user try-restart overdeck-collector-front.service
fi

echo "Installed ${unit_dest}"
echo "Installed ${front_socket_dest}"
echo "Installed ${front_service_dest}"
echo "Installed ${startup_boost_dest}"
echo "Not enabled and not started. To run it:"
echo "  systemctl --user enable --now overdeck-collector.service"
