#!/usr/bin/env bash

export NVM_DIR="$PWD/.nvm"

install_fake_node() {
  mkdir -p "$1/bin"
  echo "#!/usr/bin/env echo" >"$1/bin/node"
  chmod +x "$1/bin/node"
}

install_fake_node "$NVM_DIR/versions/node/v18.0.0"
mise sync node --nvm
mise ls
assert_contains "mise ls node --json | jq -r '.[] | .symlinked_to | select( . != null)'" "node/18.0.0"
ln -s ./18.0.0 "$MISE_DATA_DIR/installs/node/provider-runtime-alias"

install_fake_node "$NVM_DIR/versions/node/v20.0.0"
install_fake_node "$NVM_DIR/versions/node/v21.0.0"
install_fake_node "$NVM_DIR/versions/node/v22.0.0"
install_fake_node "$MISE_DATA_DIR/installs/node/20.0.0"
install_fake_node "$PWD/other-provider/21.0.0"
ln -s "$PWD/other-provider/21.0.0" "$MISE_DATA_DIR/installs/node/21.0.0"

mise sync node --nvm
mise ls
assert_contains "mise ls node --json | jq -r '.[] | .symlinked_to | select( . != null)'" "node/22.0.0"
assert_not_contains "mise ls node --json | jq -r '.[] | .symlinked_to | select( . != null)'" "node/20.0.0"
assert_contains "mise ls node --json | jq -r '.[] | .symlinked_to | select( . != null)'" "node/18.0.0"
assert "test -L \"$MISE_DATA_DIR/installs/node/provider-runtime-alias\""
assert_contains "readlink \"$MISE_DATA_DIR/installs/node/21.0.0\"" "other-provider/21.0.0"

# Only stale links owned by nvm are removed. Managed installs and links owned
# by other providers remain untouched.
rm -r "$NVM_DIR/versions/node/v18.0.0"
mise sync node --nvm
assert "test ! -e \"$MISE_DATA_DIR/installs/node/18.0.0\" && test ! -L \"$MISE_DATA_DIR/installs/node/18.0.0\""
assert "test -d \"$MISE_DATA_DIR/installs/node/20.0.0\""
assert_contains "readlink \"$MISE_DATA_DIR/installs/node/21.0.0\"" "other-provider/21.0.0"

# A stale link from a later selected provider must not block an earlier
# provider's desired version and then disappear during the later cleanup.
export NODENV_ROOT="$PWD/.nodenv"
install_fake_node "$NVM_DIR/versions/node/v23.0.0"
mkdir -p "$NODENV_ROOT/versions"
ln -s "$NODENV_ROOT/versions/23.0.0" "$MISE_DATA_DIR/installs/node/23.0.0"
mise sync node --nvm --nodenv
assert_contains "readlink \"$MISE_DATA_DIR/installs/node/23.0.0\"" ".nvm/versions/node/v23.0.0"
