#!/usr/bin/env bash
# `mise bootstrap --adopt <setup repository> --dry-run` previews the bootstrap
# from the whole shared configuration directory: its miserc.toml selects
# environments, and conf.d/ fragments and config.<env>.toml load, as they do
# in the real run.

require_cmd git

origin="$PWD/origin.git"
git init -q --bare -b main "$origin"

# ---- machine A shares its whole configuration directory
mkdir -p "$MISE_CONFIG_DIR/conf.d" "$MISE_CONFIG_DIR/markers"
echo work >"$MISE_CONFIG_DIR/markers/work"
echo confd >"$MISE_CONFIG_DIR/markers/confd"
cat <<'EOF' >"$MISE_CONFIG_DIR/config.toml"
[env]
FROM_BASE = "base"
EOF
cat <<'EOF' >"$MISE_CONFIG_DIR/miserc.toml"
env = ["work"]
EOF
cat <<'EOF' >"$MISE_CONFIG_DIR/config.work.toml"
[dotfiles]
"~/.work-marker" = { source = "markers/work" }
EOF
echo personal >"$MISE_CONFIG_DIR/markers/personal"
cat <<'EOF' >"$MISE_CONFIG_DIR/config.personal.toml"
[dotfiles]
"~/.personal-marker" = { source = "markers/personal" }
EOF
cat <<'EOF' >"$MISE_CONFIG_DIR/conf.d/extra.toml"
[dotfiles]
"~/.confd-marker" = { source = "../markers/confd" }
EOF
assert_succeed "mise bootstrap dotfiles track $MISE_CONFIG_DIR"
assert_succeed "mise bootstrap dotfiles origin set file://$origin --sync manual --yes"

# other machines are other HOMEs reached through wrapper scripts
wrapper() {
  local home="$1" script="$2"
  mkdir -p "$home"
  cat <<EOF >"$script"
#!/usr/bin/env bash
export HOME="$home" XDG_CONFIG_HOME="$home/.config" MISE_CONFIG_DIR="$home/.config/mise" \\
  MISE_STATE_DIR="$home/.local/state/mise" MISE_DATA_DIR="$home/.local/share/mise" \\
  MISE_CACHE_DIR="$home/.cache/mise" MISE_TRUSTED_CONFIG_PATHS="$home"
cd "\$HOME" && exec mise "\$@"
EOF
  chmod +x "$script"
}

# ---- machine B: a fresh HOME previews the adoption
B="$(dirname "$HOME")/b-home"
wrapper "$B" "$PWD/b"

preview="$("$PWD/b" bootstrap --adopt "file://$origin" --dry-run --only dotfiles 2>&1)"
[[ $preview == *'~/.work-marker'* ]] || fail "preview skips config.work.toml selected by miserc.toml: $preview"
[[ $preview == *'~/.confd-marker'* ]] || fail "preview skips conf.d/: $preview"
assert_fail "test -e $B/.work-marker"
assert_fail "test -e $B/.config/mise/config.toml"

# the real adoption deploys what the preview showed
assert_succeed "$PWD/b bootstrap --adopt file://$origin --yes --only dotfiles"
assert "cat $B/.work-marker" "work"
assert "cat $B/.confd-marker" "confd"

# ---- machine C chooses its own environment in miserc.local.toml, which is
# never shared; the preview selects the same files the real run will
C="$(dirname "$HOME")/c-home"
wrapper "$C" "$PWD/c"
mkdir -p "$C/.config/mise"
echo 'env = ["personal"]' >"$C/.config/mise/miserc.local.toml"
preview="$("$PWD/c" bootstrap --adopt "file://$origin" --dry-run --only dotfiles 2>&1)"
[[ $preview == *'~/.personal-marker'* ]] || fail "preview ignores this machine's miserc.local.toml: $preview"
assert_succeed "$PWD/c bootstrap --adopt file://$origin --yes --only dotfiles"
assert "cat $C/.personal-marker" "personal"
