#!/usr/bin/env bash

# The Python a pipx tool selects with `python = "..."` is locked next to the
# project's python. Updating another tool or a filtered `mise lock` must keep it.
export MISE_LOCKFILE=1
export MISE_PYTHON_GITHUB_ATTESTATIONS=0
# Without uv the lock needs no interpreter for the dependency graph.
export MISE_PYPI_UVX=0

cat <<'EOF' >mise.toml
[tools]
python = "3.13"
"pipx:yamllint" = { version = "1.38.0", python = "3.12" }
dummy = "1.0.0"
EOF
touch mise.lock

mise lock
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'
cp mise.lock mise.lock.full

echo "=== mise use keeps the selected python ==="
mise use dummy@1.1.0
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

echo "=== mise lock pipx:yamllint keeps the project python ==="
cp mise.lock.full mise.lock
mise lock pipx:yamllint
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

echo "=== mise lock python keeps the selected python ==="
cp mise.lock.full mise.lock
mise lock python
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

echo "=== mise lock python adds a missing selected python ==="
cp mise.toml mise.toml.full
grep -v 'pipx:yamllint' mise.toml.full >mise.toml
rm mise.lock
touch mise.lock
mise lock
assert_not_contains "cat mise.lock" 'specifiers = ["3.12"]'
cp mise.toml.full mise.toml
mise lock python
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

echo "=== a tool stub's selected python survives too ==="
cat <<'EOF2' >mise.toml
[tools]
python = "3.13"
EOF2
mkdir -p bin
cat <<'EOF2' >bin/yamllint
#!/usr/bin/env -S mise tool-stub

tool = "pipx:yamllint"
version = "1.38.0"
python = "3.12"
EOF2
chmod +x bin/yamllint
rm -f mise.lock
mise generate tool-stub bin/yamllint --lock
mise lock
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'
cp mise.lock mise.lock.full

mise lock python
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

cp mise.lock.full mise.lock
mise use dummy@1.1.0
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

echo "=== a task tool's selected python survives mise lock python ==="
unset MISE_LOCKFILE_MODE
cat <<'EOF2' >mise.toml
[tools]
python = "3.13"

[tasks.lint]
run = "true"
tools = { "pipx:yamllint" = { version = "1.38.0", python = "3.12" } }
EOF2
rm -f mise.lock
touch mise.lock
mise lock
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'
mise lock python
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'

echo "=== generate mode: mise lock pipx:yamllint keeps the project python ==="
export MISE_LOCKFILE_MODE=generate
cat <<'EOF2' >mise.toml
[tools]
python = "3.13"
"pipx:yamllint" = { version = "1.38.0", python = "3.12" }
dummy = "1.0.0"
EOF2
rm -f mise.lock
touch mise.lock
mise lock
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'
mise lock pipx:yamllint
assert_contains "cat mise.lock" 'specifiers = ["3.13"]'
assert_contains "cat mise.lock" 'specifiers = ["3.12"]'
