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

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

cat >"$BIN/bun" <<'SH'
#!/usr/bin/env bash
exit 0
SH
cat >"$BIN/node" <<'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/node" "$BIN/systemctl"

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

for component in botmaster-proxy actions-gateway; do
  script="$ROOT/install-${component}.sh"
  HOME="$HOME_DIR" PATH="$BIN:$PATH" OVERDECK_BACKEND_RELEASE_ROOT="$BACKEND" \
    bash "$script" >"$TESTROOT/$component.missing.out" 2>"$TESTROOT/$component.missing.err"
  if [[ "$?" != 0 ]] && grep -qF "$BACKEND/$component/current/bin/start not found" "$TESTROOT/$component.missing.err"; then rc=0; else rc=1; fi
  check "$rc" "$component installation refuses an unseeded release"

done

for component in botmaster-proxy actions-gateway; do
  mkdir -p "$BACKEND/$component/releases/$SHA/bin"
  printf '#!/usr/bin/env bash\nexit 0\n' >"$BACKEND/$component/releases/$SHA/bin/start"
  chmod +x "$BACKEND/$component/releases/$SHA/bin/start"
  ln -s "releases/$SHA" "$BACKEND/$component/current"
done

HOME="$HOME_DIR" PATH="$BIN:$PATH" OVERDECK_BACKEND_RELEASE_ROOT="$BACKEND" \
  OVERDECK_INSTALL_BOTMASTER_PROXY_DRY_RUN=1 bash "$ROOT/install-botmaster-proxy.sh" >"$TESTROOT/botmaster.unit"
if grep -qxF "ExecStart=$BACKEND/botmaster-proxy/current/bin/start" "$TESTROOT/botmaster.unit" \
  && grep -qxF "Environment=OVERDECK_BUN_BIN=$BIN/bun" "$TESTROOT/botmaster.unit" \
  && ! grep -q '__BOTMASTER_PROXY_CURRENT__\|__BUN_BIN__\|packaging/botmaster-proxy.ts' "$TESTROOT/botmaster.unit"; then rc=0; else rc=1; fi
check "$rc" 'Botmaster proxy unit executes the stable immutable release'

HOME="$HOME_DIR" PATH="$BIN:$PATH" OVERDECK_BACKEND_RELEASE_ROOT="$BACKEND" \
  OVERDECK_INSTALL_ACTIONS_GATEWAY_DRY_RUN=1 bash "$ROOT/install-actions-gateway.sh" >"$TESTROOT/gateway.unit"
if grep -qxF "WorkingDirectory=$BACKEND/actions-gateway/current/actions-gateway" "$TESTROOT/gateway.unit" \
  && grep -qxF "ExecStart=$BACKEND/actions-gateway/current/bin/start" "$TESTROOT/gateway.unit" \
  && grep -qxF "Environment=OVERDECK_NODE_BIN=$BIN/node" "$TESTROOT/gateway.unit" \
  && ! grep -q '__ACTIONS_GATEWAY_CURRENT__\|__NODE_BIN__\|dist/src/server.js' "$TESTROOT/gateway.unit"; then rc=0; else rc=1; fi
check "$rc" 'Actions Gateway unit executes the stable immutable release'

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