#!/usr/bin/env bash
# Deploy roon-extension-bandcamp to the Roon server host.
# Usage: deploy/deploy.sh <user@host> [--rollback]
#
# Layout on target:
#   /opt/roon-extension-bandcamp/releases/<version>-<timestamp>/  (dist + node_modules)
#   /opt/roon-extension-bandcamp/app -> current release (symlink)
#   /opt/roon-extension-bandcamp/config/                          (mutable state, mode 700)
#
# SKELETON (Phase 0) — flesh out and validate in Phase 5.
set -euo pipefail

TARGET="${1:?usage: deploy.sh <user@host> [--rollback]}"
BASE=/opt/roon-extension-bandcamp
SERVICE=roon-bandcamp

if [[ "${2:-}" == "--rollback" ]]; then
  ssh "$TARGET" "
    set -euo pipefail
    prev=\$(ls -1dt $BASE/releases/*/ | sed -n 2p)
    [[ -n \"\$prev\" ]] || { echo 'no previous release to roll back to' >&2; exit 1; }
    ln -sfn \"\$prev\" $BASE/app
    sudo systemctl restart $SERVICE
    echo \"rolled back to \$prev\"
  "
  exit 0
fi

VERSION=$(node -p "require('./package.json').version")
STAMP=$(date +%Y%m%d%H%M%S)
RELEASE="$BASE/releases/$VERSION-$STAMP"

echo "==> building"
npm run build
npm test

echo "==> shipping to $TARGET:$RELEASE"
ssh "$TARGET" "sudo mkdir -p '$RELEASE' && sudo chown hans:hans '$RELEASE'"
# Use tar+scp instead of rsync for cross-platform compatibility (Windows/Linux)
tar -czf /tmp/release.tar.gz dist package.json package-lock.json
scp /tmp/release.tar.gz "$TARGET:/tmp/"
ssh "$TARGET" "cd '$RELEASE' && tar -xzf /tmp/release.tar.gz && rm /tmp/release.tar.gz && sudo chown -R hans:hans ."
rm /tmp/release.tar.gz

echo "==> installing production deps + switching symlink"
ssh "$TARGET" "
  set -euo pipefail
  cd '$RELEASE'
  npm ci --omit=dev
  sudo chown -R roon-bandcamp:roon-bandcamp '$RELEASE'
  sudo rm -rf $BASE/app
  sudo ln -sfn '$RELEASE' $BASE/app
  sudo systemctl restart $SERVICE
"

echo "==> pruning old releases (keep 3)"
ssh "$TARGET" "ls -1dt $BASE/releases/*/ | tail -n +4 | xargs -r sudo rm -rf"

echo "==> done. check: ssh $TARGET journalctl -u $SERVICE -n 20"
