#!/usr/bin/env bash

echo 'dummy 1' >.tool-versions
mise install dummy@1.0.0

assert_contains "mise ls --installed dummy" "1.0.0"
assert_not_contains "mise ls --installed dummy" "1.1.0"

mise upgrade dummy

assert_contains "mise ls --installed dummy" "1.1.0"
assert_not_contains "mise ls --installed dummy" "1.0.0"

mise upgrade dummy --bump
assert_contains "mise ls --installed dummy" "2.0.0"
assert_not_contains "mise ls --installed dummy" "1.1.0"
rm .tool-versions

# ensure options are retained
mise use "ubi:bazelbuild/buildtools[exe=buildifier,matching=buildifier]@7.1.2"
assert "cat mise.toml" '[tools]
"ubi:bazelbuild/buildtools" = { version = "7.1.2", exe = "buildifier", matching = "buildifier" }'
bazelbuild_latest=$(mise latest ubi:bazelbuild/buildtools)
mise up --bump ubi:bazelbuild/buildtools
assert "cat mise.toml" "[tools]
\"ubi:bazelbuild/buildtools\" = { version = \"$bazelbuild_latest\", exe = \"buildifier\", matching = \"buildifier\" }"

rm -f .tool-versions
echo "tools.dummy = 'prefix:1'" >mise.toml
mise uninstall dummy --all
mkdir -p "$MISE_DATA_DIR/installs/dummy/1.0.0"
assert "mise ls dummy --outdated" "dummy  1.0.0 (outdated)  ~/workdir/mise.toml  prefix:1"
assert "mise up -n" "Would uninstall dummy@1.0.0
Would install dummy@1.1.0"
mise up
assert "mise ls dummy" "dummy  1.1.0  ~/workdir/mise.toml  prefix:1"
assert "mise up dummy -n --bump" "Would uninstall dummy@1.1.0
Would install dummy@2.0.0
Would bump dummy@prefix:2 in ~/workdir/mise.toml"
mise up dummy --bump
assert "mise ls dummy" "dummy  2.0.0  ~/workdir/mise.toml  prefix:2"
echo "tools.dummy = 'prefix:1'" >mise.toml
mise uninstall dummy --all
mise i dummy@1.0.0
assert "mise up dummy -n --bump" "Would uninstall dummy@1.0.0
Would install dummy@2.0.0
Would bump dummy@prefix:2 in ~/workdir/mise.toml"
mise up dummy --bump
assert "mise ls dummy" "dummy  2.0.0  ~/workdir/mise.toml  prefix:2"

cat <<EOF >mise.toml
[tools]
dummy = "latest"
EOF
assert "mise uninstall dummy --all"
assert "mise i dummy@1.0.0"
assert "mise up --bump"
assert "cat mise.toml" '[tools]
dummy = "latest"'

# Test: --dry-run-code should exit non-zero when there are outdated tools
echo "tools.dummy = 'prefix:1'" >mise.toml
mise uninstall dummy --all
mkdir -p "$MISE_DATA_DIR/installs/dummy/1.0.0"
assert_fail_contains "mise up --dry-run-code 2>&1" "Would install"
# Verify nothing was actually upgraded
assert "ls $MISE_DATA_DIR/installs/dummy/1.0.0"

# Test: --dry-run-code should exit 0 when everything is up to date
mise up
assert_contains "mise up --dry-run-code 2>&1" "All tools are up to date"

# Test that upgrading a specific tool doesn't check other tools
# This verifies the fix for https://github.com/jdx/mise/discussions/7328
cat <<EOF >mise.toml
[tools]
dummy = "1"
tiny = "1"
EOF
mise uninstall dummy tiny --all
mise install dummy@1.0.0 tiny@1.0.0

# Upgrade only dummy, should not see any warnings about tiny
output=$(mise upgrade dummy --bump 2>&1)
assert_not_contains "echo '$output'" "Error getting latest version for tiny"
assert_not_contains "echo '$output'" "WARN.*tiny"
assert_contains "mise ls --installed dummy" "2.0.0"
# dummy 1.0.0 should have been uninstalled since we upgraded it
assert_not_contains "mise ls --installed dummy" "1.0.0"
# tiny should still be at 1.0.0 since we didn't upgrade it
assert_contains "mise ls --installed tiny" "1.0.0"
assert_not_contains "mise ls --installed tiny" "1.1.0"
