#!/usr/bin/env bash
# shellcheck disable=SC2088
set -euo pipefail

export MISE_EXPERIMENTAL=1
orig_path="$PATH"

# shellcheck disable=SC1090
eval "$(mise activate bash --status)" && _mise_hook

assert() {
	local actual="$1"
	local expected="$2"
	if [[ "$actual" != "$expected" ]]; then
		echo "actual: $actual"
		echo "expected: $expected"
		exit 1
	fi
}

assert_path() {
  local expected="$1"
  local actual="${PATH/%$orig_path/}"
  actual="${actual%:}"
  actual="${actual%:}"
  actual="${actual//$ROOT/ROOT}"
  actual="${actual//$MISE_DATA_DIR\/installs/INSTALLS}"
  if [[ "$actual" != "$expected" ]]; then
    echo "Invalid PATH:  $actual"
    echo "Expected PATH: $expected"
    exit 1
  fi
}

NODE_18="INSTALLS/node/18.0.0/bin"
NODE_20="INSTALLS/node/20.0.0/bin"
TINY="INSTALLS/tiny/latest/bin"
SHELLCHECK="INSTALLS/shellcheck/0.9.0/bin"
SHFMT="INSTALLS/shfmt/3.6.0/bin"

mise ls
mise i && _mise_hook
test "$(node -v)" = "v20.0.0"
assert_path "/root:ROOT/e2e/cwd:$NODE_20:$TINY:$SHELLCHECK:$SHFMT"
assert "$FOO" "cd"

cd 18 && mise i && _mise_hook
test "$(node -v)" = "v18.0.0"
assert_path "/root:ROOT/e2e/cwd:$NODE_18:$TINY:$SHELLCHECK:$SHFMT"
assert "$FOO" "18"

cd .. && _mise_hook
test "$(node -v)" = "v20.0.0"
assert_path "/root:ROOT/e2e/cwd:$NODE_20:$TINY:$SHELLCHECK:$SHFMT"

export PATH="PRE:$PATH"
cd 18 && _mise_hook
test "$(node -v)" = "v18.0.0"
assert_path "PRE:/root:ROOT/e2e/cwd:$NODE_18:$TINY:$SHELLCHECK:$SHFMT"

mise shell node@18.0.0 && _mise_hook
test "$(node -v)" = "v18.0.0"

mise deactivate
assert_path "PRE"
