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

# Simple helper to install the sysg binary system-wide.
# Usage: ./scripts/install-systemg.sh /path/to/sysg

if [ "${UID}" -ne 0 ]; then
  echo "This installer must be run as root (sudo)." >&2
  exit 1
fi

if [ "${#}" -ne 1 ]; then
  echo "Usage: $0 /path/to/sysg" >&2
  exit 1
fi

SOURCE="$1"
if [ ! -f "$SOURCE" ]; then
  echo "Binary not found: $SOURCE" >&2
  exit 1
fi

VERSION=$("$SOURCE" --version 2>/dev/null | awk 'NR == 1 { print $2; exit }' | sed 's/^v//')
if [ -z "$VERSION" ]; then
  echo "Could not determine the version of: $SOURCE" >&2
  exit 1
fi

VERSIONS_DIR="/usr/lib/systemg/versions"
VERSION_DIR="$VERSIONS_DIR/$VERSION"
TARGET="$VERSION_DIR/sysg"
STAGED="$VERSION_DIR/.sysg.$$"

install -d -m755 "$VERSIONS_DIR"
install -d -m755 "$VERSION_DIR"
install -m755 "$SOURCE" "$STAGED"
if [ "$("$STAGED" --version 2>/dev/null | awk 'NR == 1 { print $2; exit }' | sed 's/^v//')" != "$VERSION" ]; then
  echo "Staged binary failed version verification." >&2
  exit 1
fi
mv -f "$STAGED" "$TARGET"

OS="$(uname -s)"

if [ "$OS" = "Darwin" ]; then
  # macOS: native system locations under /Library; launchd owns the daemon.
  STATE_DIR="/Library/Application Support/systemg"
  LOG_DIR="/Library/Logs/systemg"
  CONFIG_DIR="$STATE_DIR/etc"
  install -d -m755 "$STATE_DIR" "$LOG_DIR" "$CONFIG_DIR"

  LINK_TMP="/usr/local/bin/.sysg-link.$$"
  install -d -m755 /usr/local/bin
  rm -f "$LINK_TMP"
  ln -s "$TARGET" "$LINK_TMP"
  mv -f "$LINK_TMP" /usr/local/bin/sysg

  LEGACY_PLIST="/Library/LaunchDaemons/dev.sysg.supervisor.plist"
  if [ -f "$LEGACY_PLIST" ]; then
    launchctl unload -w "$LEGACY_PLIST" 2>/dev/null || true
    rm -f "$LEGACY_PLIST"
  fi

  CONFIG="$CONFIG_DIR/systemg.yaml"
  if [ -f "$CONFIG" ]; then
    "$TARGET" --sys install-boot --config "$CONFIG" --scope system --write
  else
    echo "No manifest at $CONFIG yet. After writing one, install the boot daemon with:"
    echo "  sudo sysg --sys install-boot --config $CONFIG --write --enable"
    exit 0
  fi

  echo "Installation complete."
  exit 0
fi

install -d -m755 /etc/systemg
install -d -m755 /var/lib/systemg
install -d -m755 /var/log/systemg
install -d -m755 /etc/systemg/logrotate

if ! "$TARGET" --sys upgrade-supervisor --binary "$TARGET"; then
  echo "sysg $VERSION was installed but not activated." >&2
  echo "The existing /usr/bin/sysg target was left unchanged." >&2
  exit 1
fi

LINK_TMP="/usr/bin/.sysg-link.$$"
rm -f "$LINK_TMP"
ln -s "$TARGET" "$LINK_TMP"
mv -f "$LINK_TMP" /usr/bin/sysg

cat <<'LOGROTATE' > /etc/logrotate.d/systemg
/var/log/systemg/supervisor.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
    copytruncate
}
LOGROTATE

CONFIG="/etc/systemg/systemg.yaml"

if [ ! -d /run/systemd/system ]; then
  echo "Installation complete. This machine is not run by systemd, so no unit was written."
  if [ -f "$CONFIG" ]; then
    echo "Have your service manager run the supervisor directly:"
    echo "  sysg --sys start --attached --config $CONFIG"
    echo "Give it restart-on-failure and a TERM-based stop; sysg handles the rest."
  else
    echo "After writing a manifest at $CONFIG, have your service manager run:"
    echo "  sysg --sys start --attached --config $CONFIG"
    echo "Give it restart-on-failure and a TERM-based stop; sysg handles the rest."
  fi
  exit 0
fi

rm -f /etc/systemd/system/sysg.service.d/socket-activation.conf
rmdir /etc/systemd/system/sysg.service.d 2>/dev/null || true

UNIT="/etc/systemd/system/sysg.service"
if [ -f "$UNIT" ] && ! grep -q "Generated by sysg install-boot" "$UNIT"; then
  cp "$UNIT" "$UNIT.pre-install-boot"
  rm -f "$UNIT"
  echo "Kept the previous unit as $UNIT.pre-install-boot."
fi

if [ ! -f "$CONFIG" ]; then
  echo "Installation complete. No manifest at $CONFIG yet."
  echo "After writing one, install and enable the boot unit with:"
  echo "  sudo sysg --sys install-boot --config $CONFIG --write --enable"
  exit 0
fi

echo "Installation complete."
"$TARGET" --sys install-boot --config "$CONFIG" --scope system --write
