#!/usr/bin/env bash

export MISE_LOCKFILE=1

# Exercise the install path, which resolves runtime requests a second time.
# Both writers must keep CLI provenance separate from the borrowed pin owner.
for mode in merge generate; do
  (
    export MISE_LOCKFILE_MODE="$mode"
    mkdir "$mode"
    cd "$mode"
    cat >mise.toml <<'TOML'
[tools]
dummy = "1"
TOML
    cat >mise.lock <<'TOML'
lockfile_version = 1

[[tools.dummy]]
version = "1.0.0"
backend = "asdf:dummy"
specifiers = ["1"]
TOML
    mise uninstall dummy --all
    assert "mise x dummy -- dummy --version" "This is Dummy 1.0.0! --version"
    assert_contains "cat mise.lock" 'version = "1.0.0"'

    assert "mise x dummy@2.0.0 -- dummy --version" "This is Dummy 2.0.0! --version"
    assert_contains "cat mise.lock" 'version = "1.0.0"'
    assert_not_contains "cat mise.lock" 'version = "2.0.0"'

    # Direct use requests retain their ordinary pin lookup.
    mise install dummy@1.1.0
    mise use dummy@1
    assert "mise x dummy -- dummy --version" "This is Dummy 1.0.0! --version"

    # Upgrade intentionally reattributes the request to the config it updates.
    # Remove the version installed for the use check so this exercises an upgrade,
    # rather than the already-installed explicit-version no-op.
    mise uninstall dummy@1.1.0
    mise upgrade dummy@1.1.0
    assert_contains "cat mise.lock" 'version = "1.1.0"'
    assert_not_contains "cat mise.lock" 'version = "1.0.0"'
    assert_not_contains "cat mise.lock" 'version = "2.0.0"'

    # A matching runtime request may populate a missing entry after installation.
    mise uninstall dummy --all
    printf 'lockfile_version = 1\n' >mise.lock
    assert "mise x dummy -- dummy --version" "This is Dummy 1.1.0! --version"
    assert_contains "cat mise.lock" 'version = "1.1.0"'
  )
done
