#!/usr/bin/env bash

set -euo pipefail

export MISE_RUSTUP_HOME="$PWD/rustup"
export MISE_CARGO_HOME="$PWD/cargo"

SERVER_ROOT="$PWD/server"
mkdir -p "$SERVER_ROOT"

cat >"$SERVER_ROOT/rustup-init" <<'INIT'
#!/usr/bin/env bash
set -euo pipefail

mkdir -p "$RUSTUP_HOME" "$CARGO_HOME/bin"
echo init >>"$RUSTUP_HOME/init.log"
# Widen the race so a second mise process would also try to initialize rustup.
sleep 1

cat >"$CARGO_HOME/bin/rustup" <<'RUSTUP'
#!/usr/bin/env bash
set -euo pipefail

case "${1:-} ${2:-}" in
	"show profile")
		echo minimal
		;;
	"toolchain install")
		version="$3"
		if ! mkdir "$RUSTUP_HOME/install-in-progress" 2>/dev/null; then
			echo "concurrent rustup toolchain install" >&2
			exit 88
		fi
		trap 'rmdir "$RUSTUP_HOME/install-in-progress"' EXIT
		echo "$version" >>"$RUSTUP_HOME/toolchain-installs.log"
		sleep 1
		mkdir -p "$RUSTUP_HOME/toolchains/$version"
		;;
	"component list" | "target list")
		;;
	*)
		echo "unexpected rustup args: $*" >&2
		exit 1
		;;
esac
RUSTUP

cat >"$CARGO_HOME/bin/rustc" <<'RUSTC'
#!/usr/bin/env bash
set -euo pipefail

test -d "$RUSTUP_HOME/toolchains/$RUSTUP_TOOLCHAIN"
echo "rustc $RUSTUP_TOOLCHAIN"
RUSTC

cat >"$CARGO_HOME/bin/cargo" <<'CARGO'
#!/usr/bin/env bash
echo cargo
CARGO

chmod +x "$CARGO_HOME/bin/rustup" "$CARGO_HOME/bin/rustc" "$CARGO_HOME/bin/cargo"
touch "$RUSTUP_HOME/settings.toml"
INIT

start_http_server --dir "$SERVER_ROOT"

cat >mise.toml <<EOF
[settings]
url_replacements = { 'regex:^https://sh\.rustup\.rs/?$' = "http://127.0.0.1:$HTTP_PORT/rustup-init" }
EOF

mise install rust@1.80.0 >install-1.log 2>&1 &
PID_1=$!
mise install rust@1.81.0 >install-2.log 2>&1 &
PID_2=$!

STATUS_1=0
STATUS_2=0
wait "$PID_1" || STATUS_1=$?
wait "$PID_2" || STATUS_2=$?
if [[ $STATUS_1 -ne 0 || $STATUS_2 -ne 0 ]]; then
  cat install-1.log install-2.log
  fail "parallel Rust installs failed: $STATUS_1, $STATUS_2"
fi

assert_contains "wc -l <'$MISE_RUSTUP_HOME/init.log'" "1"
assert_contains "sort '$MISE_RUSTUP_HOME/toolchain-installs.log'" "1.80.0"
assert_contains "sort '$MISE_RUSTUP_HOME/toolchain-installs.log'" "1.81.0"
assert "test -L '$MISE_DATA_DIR/installs/rust/1.80.0'"
assert "test -L '$MISE_DATA_DIR/installs/rust/1.81.0'"
assert_contains "mise x rust@1.80.0 -- rustc -V" "rustc 1.80.0"
assert_contains "mise x rust@1.81.0 -- rustc -V" "rustc 1.81.0"
assert "test ! -e '$MISE_RUSTUP_HOME/install-in-progress'"
assert_not_contains "cat install-1.log install-2.log" "Permission denied"
