#!/usr/bin/env bash
set -euo pipefail

if [[ "$(uname -s)" != "Linux" ]]; then
    printf 'test-managed-cargo-smoke.sh requires Linux; use macos_integration for macOS.\n' >&2
    exit 2
fi

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BINARY="${BOT_FORGE_SMOKE_BINARY:-$ROOT_DIR/target/debug/bot-forge}"
WORK_DIR="$(mktemp -d)"
trap 'rm -rf "$WORK_DIR"' EXIT

FORGE_HOME="$WORK_DIR/forge-home"
USER_HOME="$WORK_DIR/user-home"
FAKE_BIN="$WORK_DIR/fake-bin"
CONFIG="$WORK_DIR/smoke.toml"
mkdir -p "$FORGE_HOME/bin" "$USER_HOME" "$FAKE_BIN"

cat >"$FAKE_BIN/cargo" <<'SH'
#!/bin/sh
set -eu
root=""
while [ "$#" -gt 0 ]; do
    if [ "$1" = "--root" ]; then
        root="$2"
        shift 2
        continue
    fi
    shift
done
test -n "$root"
mkdir -p "$root/bin"
printf '#!/bin/sh\necho smoke-tool 1.0.0\n' >"$root/bin/smoke-tool"
chmod +x "$root/bin/smoke-tool"
SH
chmod +x "$FAKE_BIN/cargo"

cat >"$FAKE_BIN/rustup" <<'SH'
#!/bin/sh
set -eu
printf 'unexpected rustup invocation\n' >"${BOT_FORGE_SMOKE_RUSTUP_MARKER:?}"
exit 97
SH
chmod +x "$FAKE_BIN/rustup"

cat >"$CONFIG" <<'TOML'
catalog = "rust-dev"

[policy]
allow_unlocked_cargo = true

[profiles.smoke]
components = ["smoke-tool"]

[[components]]
id = "rust-toolchain"
provides = ["cargo", "rustup"]
platforms = ["linux-*"]
detect = { kind = "command", program = "sh", args = ["-c", "exit 0"] }

[[components]]
id = "smoke-tool"

[components.detect]
kind = "command"
program = "smoke-tool"
args = ["--version"]

[components.install]
backend = "cargo"
crate = "smoke-tool"
version = "=1.0.0"
locked = false
bins = ["smoke-tool"]
TOML

run_forge() {
    HOME="$USER_HOME" \
        USERPROFILE="$USER_HOME" \
        BOT_FORGE_HOME="$FORGE_HOME" \
        BOT_FORGE_BIN_DIR="$FORGE_HOME/bin" \
        BOT_FORGE_SMOKE_RUSTUP_MARKER="$WORK_DIR/unexpected-rustup" \
        RUSTUP_AUTO_INSTALL=0 \
        RUSTUP_HOME="$WORK_DIR/rustup-home" \
        PATH="$FORGE_HOME/bin:$FAKE_BIN:$PATH" \
        "$BINARY" "$@"
}

run_forge install smoke --yes --config "$CONFIG"
test ! -e "$WORK_DIR/unexpected-rustup"
test -L "$FORGE_HOME/bin/smoke-tool"
"$FORGE_HOME/bin/smoke-tool" --version | grep -Fq 'smoke-tool 1.0.0'

STATUS="$(run_forge status smoke --format json --config "$CONFIG")"
python3 -c '
import json, sys

status = json.load(sys.stdin)
assert status["profile"] == "smoke"
assert status["pending_journals"] == []
assert len(status["managed"]) == 1
assert status["managed"][0]["name"] == "smoke-tool"
assert status["managed"][0]["backend"] == "cargo"
assert status["tools"][0]["installed"] is True
' <<<"$STATUS"
run_forge resume | grep -Fq '没有可恢复的未完成事务'

run_forge remove smoke-tool --kind tool --yes
test ! -e "$FORGE_HOME/bin/smoke-tool"
python3 -c '
import json, sys

registry = json.load(open(sys.argv[1]))
assert registry["entries"] == []
' "$FORGE_HOME/registry.json"

mkdir -p "$FORGE_HOME/journals/crashed"
cat >"$FORGE_HOME/journals/crashed/smoke.json" <<'JSON'
{
  "run_id": "crashed",
  "component": "smoke",
  "plan_hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "config_hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
  "phase": "prepared",
  "artifact_id": null,
  "previous_artifact_id": null,
  "activation_paths": [],
  "updated_at": 1
}
JSON
run_forge resume --abandon crashed
grep -Fq '"phase": "abandoned"' "$FORGE_HOME/journals/crashed/smoke.json"

printf 'Light profile install/status/remove/recovery smoke passed.\n'
