#!/bin/sh
# Hermetic behavior test for release-acquire-int.sh. Fake gh/spt commands prove preflight and
# post-install version checks without mutating the real registry or accessing GitHub.
set -u
ROOT=$(CDPATH= cd "$(dirname "$0")/.." && pwd)
ACQUIRE="$ROOT/ci/publish/release-acquire-int.sh"
rc=0
fail() { printf 'FAIL: %s\n' "$1"; rc=1; }
ok() { printf 'ok   %s\n' "$1"; }

for tool in cat chmod cp dirname env grep mkdir mktemp rm; do
  command -v "$tool" >/dev/null 2>&1 || { echo "FAIL: required tool unavailable: $tool"; exit 1; }
done
SH=$(command -v sh) || { echo "FAIL: sh unavailable"; exit 1; }
TMP=$(mktemp -d "${TMPDIR:-/tmp}/omp-spt-release-acquire.XXXXXX") || { echo "FAIL: mktemp"; exit 1; }
trap 'rm -rf "$TMP"' EXIT INT TERM
BIN="$TMP/bin"
TARGET=x86_64-unknown-linux-musl
ADAPTER_SHA256=5b465273498e39bb29fe8ac0754f6115132dd783390de7e2f74a1bb58722caf9
HELPER_SHA256=dfe20ec25251dc484bc628dbf35f51fb5df08446a78af60574e6b3231e893fc0
MISMATCHED_SHA256=0000000000000000000000000000000000000000000000000000000000000000
export OMP_SPT_EXPECTED_ADAPTER_SHA256=$ADAPTER_SHA256
export OMP_SPT_EXPECTED_HELPER_SHA256=$HELPER_SHA256
INSTALL_DIR="$TMP/installed/BigscreenVR-omp-spt_github"
export FAKE_INSTALL_DIR=$INSTALL_DIR
mkdir -p "$BIN" "$TMP/empty" "$TMP/spt-only" "$INSTALL_DIR"

cat > "$BIN/gh" <<'EOF'
#!/bin/sh
case "$1 $2" in
  "auth status")
    [ "${FAKE_GH_AUTH_FAIL:-0}" = "1" ] && { echo "not authenticated" >&2; exit 1; }
    exit 0
    ;;
  "release download")
    shift 2
    [ "${1:-}" = "v0.2.0" ] || { echo "unexpected release tag: ${1:-}" >&2; exit 64; }
    shift
    output=
    while [ "$#" -gt 0 ]; do
      case "$1" in
        --repo)
          [ "${2:-}" = "BigscreenVR/omp-spt" ] \
            || { echo "unexpected release repo: ${2:-}" >&2; exit 64; }
          shift 2
          ;;
        --pattern)
          [ "${2:-}" = "adapter.spt" ] \
            || { echo "unexpected release pattern: ${2:-}" >&2; exit 64; }
          shift 2
          ;;
        --output)
          output=${2:-}
          shift 2
          ;;
        *)
          echo "unexpected release download argument: $1" >&2
          exit 64
          ;;
      esac
    done
    [ -n "$output" ] || { echo "missing release download output" >&2; exit 64; }
    printf '%s' 'hosted adapter.spt' > "$output"
    ;;
  *) echo "unexpected gh invocation: $*" >&2; exit 64 ;;
esac
EOF
cat > "$BIN/tar" <<'EOF'
#!/bin/sh
[ "$#" -eq 3 ] && [ "$1" = "-xOzf" ] \
  || { echo "unexpected tar invocation: $*" >&2; exit 64; }
case "${OMP_SPT_ACCEPTANCE_TARGET:-}" in
  x86_64-pc-windows-msvc) expected=x86_64-pc-windows-msvc/omp-spt.exe ;;
  x86_64-unknown-linux-gnu) expected=x86_64-unknown-linux-gnu/omp-spt ;;
  x86_64-unknown-linux-musl) expected=x86_64-unknown-linux-musl/omp-spt ;;
  *) echo "unexpected acceptance target for extraction" >&2; exit 64 ;;
esac
[ "$3" = "$expected" ] \
  || { echo "wrong selected helper member: expected $expected, got $3" >&2; exit 64; }
[ "${FAKE_MISSING_TARGET_MEMBER:-0}" != "1" ] \
  || { echo "selected target member is absent" >&2; exit 2; }
printf '%s' 'hosted selected helper'
EOF


cat > "$BIN/spt" <<'EOF'
#!/bin/sh
case "$*" in
  "adapter remove omp-spt") exit 0 ;;
  "adapter add --release BigscreenVR/omp-spt --tag v0.2.0")
    if [ "${FAKE_ADD_FAIL:-0}" = "1" ]; then
      echo "fetched before failure"
      exit 9
    fi
    helper=omp-spt
    case "${OMP_SPT_ACCEPTANCE_TARGET:-}" in
      x86_64-pc-windows-msvc) helper=omp-spt.exe ;;
    esac
    mkdir -p "$FAKE_INSTALL_DIR"
    printf '%s' "${FAKE_INSTALLED_HELPER_CONTENT:-hosted selected helper}" \
      > "$FAKE_INSTALL_DIR/$helper"
    echo "fetched registered active"
    ;;
  "adapter list") echo "omp-spt: Harness Pointer active (from $FAKE_INSTALL_DIR)" ;;
  "adapter version omp-spt") printf '%s\n' "${FAKE_VERSION:-0.2.0}" ;;
  "adapter get-string omp-spt adapter_label") echo "oh-my-pi (spt)" ;;
  *) echo "unexpected spt invocation: $*" >&2; exit 64 ;;
esac
EOF
chmod 0755 "$BIN/gh" "$BIN/spt" "$BIN/tar"
cp "$BIN/spt" "$TMP/spt-only/spt"

expect_failure() {
  name=$1
  expected=$2
  shift 2
  if "$@" >"$TMP/output" 2>&1; then
    fail "$name unexpectedly succeeded"
  elif grep -Fq "$expected" "$TMP/output"; then
    ok "$name fails closed"
  else
    fail "$name failed for the wrong reason: $(cat "$TMP/output")"
  fi
}

# Non-opt-in execution is the only intentional skip and must not require release inputs.
if OMP_SPT_ACCEPTANCE=0 "$SH" "$ACQUIRE" >"$TMP/output" 2>&1 \
   && grep -Fq "SKIP: set OMP_SPT_ACCEPTANCE=1" "$TMP/output"; then
  ok "non-opt-in acquisition skips explicitly"
else
  fail "non-opt-in acquisition did not produce its explicit skip"
fi

# Once opted in, missing inputs and tooling are release failures, never green skips.
expect_failure "missing release tag" "OMP_SPT_RELEASE_TAG is required" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_EXPECTED_VERSION=0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "missing expected version" "OMP_SPT_EXPECTED_VERSION is required" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "missing acceptance target" "OMP_SPT_ACCEPTANCE_TARGET is required" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 "$SH" "$ACQUIRE"
expect_failure "missing expected adapter digest" "OMP_SPT_EXPECTED_ADAPTER_SHA256 is required" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
  OMP_SPT_EXPECTED_ADAPTER_SHA256= "$SH" "$ACQUIRE"
expect_failure "malformed expected adapter digest" "must be 64 lowercase hexadecimal characters" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
  OMP_SPT_EXPECTED_ADAPTER_SHA256=not-a-digest "$SH" "$ACQUIRE"
expect_failure "missing expected helper digest" "OMP_SPT_EXPECTED_HELPER_SHA256 is required" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
  OMP_SPT_EXPECTED_HELPER_SHA256= "$SH" "$ACQUIRE"
expect_failure "malformed expected helper digest" "must be 64 lowercase hexadecimal characters" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
  OMP_SPT_EXPECTED_HELPER_SHA256=not-a-digest "$SH" "$ACQUIRE"
expect_failure "unsupported acceptance target" "is not a release target" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET=aarch64-unknown-linux-musl \
  "$SH" "$ACQUIRE"
expect_failure "noncanonical release tag" "must equal v0.2.0" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=omp-spt-v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "missing spt" "spt is required on PATH" \
  env PATH="$TMP/empty" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "missing gh" "gh is required on PATH" \
  env PATH="$TMP/spt-only" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "unauthenticated gh" "gh is not authenticated" \
  env PATH="$BIN:$PATH" FAKE_GH_AUTH_FAIL=1 OMP_SPT_ACCEPTANCE=1 \
  OMP_SPT_RELEASE_TAG=v0.2.0 OMP_SPT_EXPECTED_VERSION=0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"

# Every archive target is an accepted evidence key; the musl run is representative only when the
# operator executes it on the OMP-capable host required by the release runbook.
for TARGET in x86_64-pc-windows-msvc x86_64-unknown-linux-gnu x86_64-unknown-linux-musl; do
  if env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
     OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
     "$SH" "$ACQUIRE" >"$TMP/output" 2>&1 \
     && grep -Fq "acceptance evidence target is exactly $TARGET" "$TMP/output" \
     && grep -Fq "adapter version is exactly 0.2.0" "$TMP/output" \
     && grep -Fq "hosted adapter.spt SHA-256 is exactly $ADAPTER_SHA256" "$TMP/output" \
     && grep -Fq "hosted $TARGET/omp-spt" "$TMP/output" \
     && grep -Fq "selected helper SHA-256 is exactly $HELPER_SHA256" "$TMP/output" \
     && grep -Fq "installed selected helper SHA-256 matches hosted member" "$TMP/output" \
     && grep -Fq "RELEASE-ACQUIRE-INT OK target=$TARGET" "$TMP/output"; then
    ok "canonical tagged acquisition records $TARGET"
  else
    fail "canonical tagged acquisition dry run failed for $TARGET: $(cat "$TMP/output")"
  fi
done

expect_failure "mismatched hosted adapter digest" "hosted adapter.spt SHA-256" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
  OMP_SPT_EXPECTED_ADAPTER_SHA256="$MISMATCHED_SHA256" "$SH" "$ACQUIRE"
expect_failure "mismatched selected helper digest" "selected helper SHA-256" \
  env PATH="$BIN:$PATH" OMP_SPT_ACCEPTANCE=1 OMP_SPT_RELEASE_TAG=v0.2.0 \
  OMP_SPT_EXPECTED_VERSION=0.2.0 OMP_SPT_ACCEPTANCE_TARGET="$TARGET" \
  OMP_SPT_EXPECTED_HELPER_SHA256="$MISMATCHED_SHA256" "$SH" "$ACQUIRE"
expect_failure "missing selected target member" "does not contain selected helper" \
  env PATH="$BIN:$PATH" FAKE_MISSING_TARGET_MEMBER=1 OMP_SPT_ACCEPTANCE=1 \
  OMP_SPT_RELEASE_TAG=v0.2.0 OMP_SPT_EXPECTED_VERSION=0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "installed helper differs from hosted member" "installed selected helper SHA-256" \
  env PATH="$BIN:$PATH" FAKE_INSTALLED_HELPER_CONTENT=wrong OMP_SPT_ACCEPTANCE=1 \
  OMP_SPT_RELEASE_TAG=v0.2.0 OMP_SPT_EXPECTED_VERSION=0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET="$TARGET" "$SH" "$ACQUIRE"
expect_failure "wrong acquired version" "does not equal expected '0.2.0'" \
  env PATH="$BIN:$PATH" FAKE_VERSION=0.1.3 OMP_SPT_ACCEPTANCE=1 \
  OMP_SPT_RELEASE_TAG=v0.2.0 OMP_SPT_EXPECTED_VERSION=0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET=x86_64-unknown-linux-musl "$SH" "$ACQUIRE"
expect_failure "failed acquisition with fetched output" "adapter add --release failed" \
  env PATH="$BIN:$PATH" FAKE_ADD_FAIL=1 OMP_SPT_ACCEPTANCE=1 \
  OMP_SPT_RELEASE_TAG=v0.2.0 OMP_SPT_EXPECTED_VERSION=0.2.0 \
  OMP_SPT_ACCEPTANCE_TARGET=x86_64-unknown-linux-musl "$SH" "$ACQUIRE"

[ "$rc" -eq 0 ] && echo "PASS: release-acquire"
exit "$rc"
