#!/bin/bash

set -euxo pipefail

unset CARGO_INSTALL_ROOT

crates="b3sum cargo-release cargo-binstall cargo-watch miniserve sccache"

if [ "$2" = "Windows" ]; then
    # Install binaries using cargo-binstall
    # shellcheck disable=SC2086
    "./$1" --log-level debug --no-confirm $crates
else
    export CARGO_HOME=/tmp/cargo-home-for-test
    export PATH="$CARGO_HOME/bin:/tmp/t/bin:$PATH"
    
    mkdir -p "/tmp/t/bin"
    # Copy it to bin to test use of env var `CARGO`
    cp "./$1" "/tmp/t/bin/cargo-binstall"
    
    # Install binaries using cargo-binstall
    # shellcheck disable=SC2086
    cargo binstall --log-level debug --no-confirm $crates

    rm -r /tmp/t
fi

# Test that the installed binaries can be run
b3sum --version
cargo-release release --version
cargo-binstall --help >/dev/null
cargo binstall --help >/dev/null
cargo watch -V
miniserve -V

test_resources=".github/scripts/cargo-tomls"

# Install binaries using `--manifest-path`
# Also test default github template
"./$1" binstall --force --log-level debug --manifest-path "$test_resources/github-test-Cargo.toml" --no-confirm cargo-binstall
# Test that the installed binaries can be run
cargo binstall --help >/dev/null

# FIXME: test this some other way that is not dependent on the version being published!
# "./$1" binstall --force --log-level debug --manifest-path crates/bin --no-confirm cargo-binstall

min_tls=1.3
[[ "${2:-}" == "Windows" ]] && min_tls=1.2 # WinTLS on GHA doesn't support 1.3 yet

"./$1" binstall \
    --force \
    --log-level debug \
    --min-tls-version $min_tls \
    --no-confirm \
    cargo-binstall
# Test that the installed binaries can be run
cargo binstall --help >/dev/null

# Test --version
"./$1" binstall --force --log-level debug --no-confirm --version 0.11.1 cargo-binstall
# Test that the installed binaries can be run
cargo binstall --help >/dev/null

# Test "$crate_name@$version"
"./$1" binstall --force --log-level debug --no-confirm cargo-binstall@0.11.1
# Test that the installed binaries can be run
cargo binstall --help >/dev/null

# Test skip when installed
"./$1" binstall --no-confirm --force cargo-binstall@0.11.1
"./$1" binstall --no-confirm cargo-binstall@0.11.1 | grep -q 'cargo-binstall v0.11.1 is already installed'

"./$1" binstall --no-confirm cargo-binstall@0.10.0 | grep -q -v 'cargo-binstall v0.10.0 is already installed'

## Test When 0.11.0 is installed but can be upgraded.
"./$1" binstall --no-confirm cargo-binstall@0.12.0
"./$1" binstall --no-confirm cargo-binstall@0.12.0 | grep -q 'cargo-binstall v0.12.0 is already installed'
"./$1" binstall --no-confirm cargo-binstall@^0.12.0 | grep -q -v 'cargo-binstall v0.12.0 is already installed'

# Test default GitLab pkg-url templates
"./$1" binstall \
    --force \
    --manifest-path "$test_resources/gitlab-test-Cargo.toml" \
    --log-level debug \
    --no-confirm \
    --disable-strategies compile \
    cargo-binstall

# Test default BitBucket pkg-url templates
"./$1" binstall \
    --force \
    --manifest-path "$test_resources/bitbucket-test-Cargo.toml" \
    --log-level debug \
    --no-confirm \
    --disable-strategies compile \
    cargo-binstall

# Test default Github pkg-url templates,
# with bin-dir provided
"./$1" binstall \
    --force \
    --manifest-path "$test_resources/github-test-Cargo2.toml" \
    --log-level debug \
    --no-confirm \
    --disable-strategies compile \
    cargo-binstall

## Test --disable-strategies
set +e

"./$1" binstall --no-confirm --disable-strategies quick-install,compile cargo-update
exit_code="$?"

if [ "$exit_code" != 94 ]; then
    echo "Expected exit code 94, but actual exit code $exit_code"
    exit 1
fi

## Test --strategies
"./$1" binstall --no-confirm --strategies crate-meta-data cargo-update
exit_code="$?"

if [ "$exit_code" != 94 ]; then
    echo "Expected exit code 94, but actual exit code $exit_code"
    exit 1
fi