#!/usr/bin/env bash
set -euo pipefail

detect_platform
export MISE_LOCKFILE_MODE=generate
assert_fail "MISE_LOCKFILE_MODE=invalid mise settings get lockfile_mode"

cat >mise.toml <<'EOF'
[settings]
lockfile_platforms = ["linux-x64", "macos-arm64"]

[tools."http:generate-fixture"]
version = "1.0.0"
url = "https://mise.jdx.dev/test-fixtures/hello-world-1.0.0.tar.gz"
bin_path = "hello-world-1.0.0/bin"
EOF

# Choosing the generator does not opt in to creating a file during install.
mise install
assert "test -e mise.lock && echo exists || echo absent" "absent"

mise lock
assert_contains "cat mise.lock" 'sha256:'
assert_not_contains "cat mise.lock" 'provenance_verified'
cp mise.lock expected.lock
mise lock
diff -u expected.lock mise.lock
mise install
diff -u expected.lock mise.lock

# A filtered update must carry the other target forward.
mise lock --platform linux-x64
diff -u expected.lock mise.lock

# `mise unuse` prunes the removed tool's entry, but an unuse that edits nothing
# leaves the lockfile exactly as it found it.
cp mise.toml with-fixture.toml
mise unuse http:generate-absent
diff -u expected.lock mise.lock
mise unuse http:generate-fixture
assert_not_contains "cat mise.lock" 'generate-fixture'
cp with-fixture.toml mise.toml
cp expected.lock mise.lock

# Explicit choices override the configured mode, with no format migration.
mise settings --local set lockfile_mode merge
assert "mise settings get lockfile_mode" "generate"
unset MISE_LOCKFILE_MODE
assert "mise settings get lockfile_mode" "merge"
mise install
diff -u expected.lock mise.lock
export MISE_LOCKFILE_MODE=generate
mise lock
diff -u expected.lock mise.lock

# Failure cannot publish over an existing lockfile.
mise settings --local set lockfile_mode generate
cat >>mise.toml <<'EOF'

[tools."http:generate-broken"]
version = "1.0.0"
url = "http://127.0.0.1:1/unavailable.tar.gz"
EOF
assert_fail "MISE_HTTP_RETRIES=0 mise lock"
diff -u expected.lock mise.lock
