#!/usr/bin/env bash

assert "mise install dummy@1.0.0"
assert "ls $MISE_DATA_DIR/installs/dummy" "1
1.0
1.0.0
latest"
assert "mise rm dummy"
assert_empty "mise ls"
assert_fail "ls $MISE_DATA_DIR/installs/dummy"

assert "mise use dummy@1.0.0"
assert_contains "mise ls dummy" "1.0.0"
assert "mise unuse dummy@1.0.0"
assert_empty "mise ls dummy"

assert "mise use dummy@1.0.0"
mkdir subdir
cd subdir || exit 1
assert "mise use -p mise.toml dummy@1.0.0"
assert "mise ls dummy" "dummy  1.0.0  ~/workdir/subdir/mise.toml  1.0.0"
assert "mise unuse dummy@1.0.0"
# version is not pruned because it's in ~/workdir/mise.toml
assert "mise ls dummy" "dummy  1.0.0  ~/workdir/mise.toml  1.0.0"
assert "mise unuse dummy@1.0.0"
assert_empty "mise ls dummy"
cd - || exit 1

assert "mise use -g dummy@1.0.0"
assert "mise ls dummy" "dummy  1.0.0  ~/.config/mise/config.toml  1.0.0"
assert "mise use dummy@1.0.0"
assert "mise ls dummy" "dummy  1.0.0  ~/workdir/mise.toml  1.0.0"
assert "mise unuse dummy@1.0.0"
assert "mise ls dummy" "dummy  1.0.0  ~/.config/mise/config.toml  1.0.0"
assert "mise unuse -g dummy@1.0.0"
assert_empty "mise ls dummy"

assert "mise use -e test dummy@1.0.0"
assert "mise ls -E test dummy" "dummy  1.0.0  ~/workdir/mise.test.toml  1.0.0"
assert "mise unuse -e test dummy@1.0.0"
assert_empty "mise ls -E test dummy"
rm ~/workdir/mise.test.toml

assert "mise use dummy@2.0.0"
assert "mise ls dummy" "dummy  2.0.0  ~/workdir/mise.toml  2.0.0"
# tool is not removed because version does not match
assert "mise unuse dummy@1.0.0"
assert "mise ls dummy" "dummy  2.0.0  ~/workdir/mise.toml  2.0.0"

# not specifying version means it will remove any version
assert "mise use dummy@2"
assert "mise ls dummy" "dummy  2.0.0  ~/workdir/mise.toml  2"
assert "mise unuse dummy"
assert_empty "mise ls dummy"

# removing a specific version preserves the other configured versions
cat >mise.toml <<'EOF'
[tools]
dummy = ["1.0.0", "2.0.0", "3.0.0"]
EOF
assert "mise unuse --no-prune dummy@1.0.0 dummy@1.0.0 2>&1" \
  "mise removed: dummy@1.0.0 from ~/workdir/mise.toml"
assert_not_contains "cat mise.toml" '"1.0.0"'
assert_contains "cat mise.toml" '"2.0.0"'
assert_contains "cat mise.toml" '"3.0.0"'

# multiple versions of the same tool are removed together without restoring an earlier one
assert_contains "mise unuse --no-prune dummy@2.0.0 dummy@3.0.0 2>&1" \
  "removed: dummy@2.0.0, dummy@3.0.0"
assert_not_contains "cat mise.toml" "dummy"

# options on an unselected structured entry are preserved
cat >mise.toml <<'EOF'
[tools]
dummy = [
  { version = "1.0.0", install_env = { REMOVE = "yes" } },
  { version = "2.0.0", install_env = { KEEP = "yes" } },
]
EOF
assert "mise unuse --no-prune dummy@1.0.0"
assert_not_contains "cat mise.toml" "REMOVE"
assert_contains "cat mise.toml" 'version = "2.0.0"'
assert_contains "cat mise.toml" 'install_env = { KEEP = "yes" }'

# .tool-versions keeps the other versions, tools, and trailing comment
cat >.tool-versions <<'EOF'
dummy 1.0.0 2.0.0 # keep me
tiny 3.1.0
EOF
assert "mise unuse --no-prune --path .tool-versions dummy@1.0.0"
assert "cat .tool-versions" "dummy 2.0.0 # keep me
tiny  3.1.0"

# --path <dir> removes from a config inside that directory and leaves the cwd's alone. This used
# to resolve from the cwd, so `unuse --path <elsewhere>` deleted the tool from the wrong file.
mkdir -p "$HOME/unusepath/from" "$HOME/unusepath/to"
printf '[tools]\ndummy = "1.0.0"\n' >"$HOME/unusepath/from/mise.toml"
printf '[tools]\ndummy = "1.0.0"\n' >"$HOME/unusepath/to/mise.toml"
cd "$HOME/unusepath/from" || exit 1

assert "mise unuse --no-prune --path ../to dummy@1.0.0"
assert "cat mise.toml" '[tools]
dummy = "1.0.0"'
# removing the only tool empties the file, as it does everywhere else
assert "cat ../to/mise.toml" ""

cd "$HOME/workdir" || exit 1
