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

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SCRIPT="$ROOT/install-controller.sh"
TESTROOT="${XDG_CACHE_HOME:-$HOME/.cache}/overdeck/tests/controller-install/run-$$-$RANDOM"
HOME_DIR="$TESTROOT/home"
BACKEND="$TESTROOT/backend"
BIN="$TESTROOT/bin"
SHA=$(printf 'a%.0s' {1..40})
mkdir -p "$HOME_DIR" "$BIN" "$BACKEND/controller/releases/$SHA/bin"
trap 'rm -rf "$TESTROOT"' EXIT

cat >"$BIN/bun" <<'SH'
#!/usr/bin/env bash
exit 0
SH
cat >"$BIN/systemctl" <<'SH'
#!/usr/bin/env bash
printf '%s\n' "$*" >>"$SYSTEMCTL_LOG"
exit 0
SH
chmod +x "$BIN/bun" "$BIN/systemctl"

fails=0
check() {
  if (( $1 == 0 )); then printf 'ok - %s\n' "$2"
  else printf 'FAIL - %s\n' "$2"; fails=$((fails + 1)); fi
}

HOME="$HOME_DIR" PATH="$BIN:$PATH" \
  OVERDECK_BACKEND_RELEASE_ROOT="$BACKEND" bash "$SCRIPT" \
  >"$TESTROOT/missing.out" 2>"$TESTROOT/missing.err"
if [[ "$?" != 0 ]] \
  && grep -qF "$BACKEND/controller/current/bin/start not found" "$TESTROOT/missing.err"; then
  rc=0
else
  rc=1
fi
check "$rc" 'installation refuses an unseeded controller release'

printf '#!/usr/bin/env bash\nexit 0\n' >"$BACKEND/controller/releases/$SHA/bin/start"
chmod +x "$BACKEND/controller/releases/$SHA/bin/start"
ln -s "releases/$SHA" "$BACKEND/controller/current"

HOME="$HOME_DIR" PATH="$BIN:$PATH" SYSTEMCTL_LOG="$TESTROOT/systemctl.log" \
  OVERDECK_BACKEND_RELEASE_ROOT="$BACKEND" bash "$SCRIPT" >"$TESTROOT/output"
unit="$HOME_DIR/.config/systemd/user/overdeck-controller.service"
if grep -qxF "WorkingDirectory=$BACKEND/controller/current/controller" "$unit" \
  && grep -qxF "ExecStart=$BACKEND/controller/current/bin/start" "$unit" \
  && grep -qxF "Environment=OVERDECK_BUN_BIN=$BIN/bun" "$unit" \
  && ! grep -q '__CONTROLLER_CURRENT__\|__BUN_BIN__\|/controller/src/index.ts' "$unit" \
  && grep -qx -- '--user daemon-reload' "$TESTROOT/systemctl.log"; then
  rc=0
else
  rc=1
fi
check "$rc" 'installed unit executes the stable immutable controller release'

HOME="$HOME_DIR" PATH="$BIN:$PATH" OVERDECK_BACKEND_RELEASE_ROOT="$BACKEND" \
  OVERDECK_INSTALL_CONTROLLER_DRY_RUN=1 bash "$SCRIPT" >"$TESTROOT/dry-run.out"
if grep -qxF "ExecStart=$BACKEND/controller/current/bin/start" "$TESTROOT/dry-run.out" \
  && [[ "$(wc -l <"$TESTROOT/systemctl.log")" == 1 ]]; then
  rc=0
else
  rc=1
fi
check "$rc" 'dry run renders the immutable unit without reloading systemd'

(( fails == 0 )) || { printf '%s check(s) failed\n' "$fails" >&2; exit 1; }
printf 'controller-install-release: all checks passed\n'
