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

ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../../.." && pwd -P)"
DISPATCH="$ROOT/modules/workstation/claude/bin/e2e-k8s-dispatch"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf -- "$TMP_DIR"' EXIT

fail() {
    printf 'e2e-k8s-dispatch argv test: %s\n' "$1" >&2
    exit 1
}

STUB_BIN="$TMP_DIR/bin"
mkdir -p "$STUB_BIN"
for command_name in ssh kubectl; do
    cat >"$STUB_BIN/$command_name" <<'STUB'
#!/usr/bin/env bash
set -u
if grep -Fq "rewrote 'pnpm exec playwright'" "$STUB_STDERR" 2>/dev/null; then
    rewrite_state=rewrite-seen
else
    rewrite_state=rewrite-missing
fi
printf '%s:%s\n' "$(basename -- "$0")" "$rewrite_state" >>"$MARKER"
exit 1
STUB
    chmod +x "$STUB_BIN/$command_name"
done

run_dispatch() {
    local stderr_file="$1"
    local marker_file="$2"
    local receipt_file="$3"
    shift 3
    PATH="$STUB_BIN:$PATH" \
        MARKER="$marker_file" \
        STUB_STDERR="$stderr_file" \
        E2E_REMOTE_RECEIPT="$receipt_file" \
        IPZ_E2E_RUNNER_IMAGE='localhost/ipz-e2e-runner:1.0.0' \
        IPZ_E2E_SNAPSHOT_DIR='/var/lib/ipz-e2e/snapshot-test' \
        IPZ_E2E_SSH_CONNECT_TIMEOUT=1 \
        timeout 10 "$DISPATCH" "$@" 2>"$stderr_file"
}

rewrite_stderr="$TMP_DIR/rewrite.stderr"
rewrite_marker="$TMP_DIR/rewrite.marker"
: >"$rewrite_marker"
set +e
run_dispatch "$rewrite_stderr" "$rewrite_marker" "$TMP_DIR/rewrite.receipt" \
    valid-run mirror_1 debian1 -- pnpm exec playwright test --config=playwright.config.js foo.spec.js
rewrite_status=$?
set -e
[[ $rewrite_status -ne 124 ]] || fail 'normalization case exceeded 10 seconds'
grep -Fq "e2e-k8s-dispatch: rewrote 'pnpm exec playwright' to the absolute runner path" "$rewrite_stderr" || \
    fail 'normalization case did not emit the rewrite sentence'
grep -Fq 'ssh:rewrite-seen' "$rewrite_marker" || \
    fail 'remote contact occurred before the rewrite sentence was emitted'

 debug_stderr="$TMP_DIR/debug.stderr"
 debug_marker="$TMP_DIR/debug.marker"
: >"$debug_marker"
set +e
run_dispatch "$debug_stderr" "$debug_marker" "$TMP_DIR/debug.receipt" \
    debug-run mirror_2 debian1 -- /bin/bash -c 'echo hi'
debug_status=$?
set -e
[[ $debug_status -ne 124 ]] || fail 'debug argv case exceeded 10 seconds'
if grep -Fq 'unsupported Playwright executable' "$debug_stderr"; then
    fail 'non-Playwright debug argv was rejected by argv validation'
fi

reject_stderr="$TMP_DIR/reject.stderr"
reject_marker="$TMP_DIR/reject.marker"
: >"$reject_marker"
set +e
run_dispatch "$reject_stderr" "$reject_marker" "$TMP_DIR/reject.receipt" \
    reject-run mirror_3 debian1 -- /usr/local/bin/playwright test foo.spec.js
reject_status=$?
set -e
[[ $reject_status -eq 6 ]] || fail "unsupported Playwright argv exited $reject_status instead of 6"
[[ ! -s "$reject_marker" ]] || fail 'unsupported Playwright argv contacted ssh or kubectl'
grep -Fq "unsupported Playwright executable '/usr/local/bin/playwright'" "$reject_stderr" || \
    fail 'unsupported Playwright argv did not emit the rejection sentence'
grep -Fq 'env NODE_PATH=/opt/ipz-e2e/node_modules /opt/ipz-e2e/node_modules/.bin/playwright' "$reject_stderr" || \
    fail 'rejection sentence did not name the canonical form'

bash -n "$DISPATCH" || fail 'dispatcher failed bash syntax validation'
printf 'e2e-k8s-dispatch argv tests: PASS\n'
