#!/bin/sh
# Detect Rust toolchain and select appropriate Makevars.

# Try PATH, then common rustup location
CARGO_PATH=$(command -v cargo 2>/dev/null)
if [ -z "$CARGO_PATH" ] && [ -f "$HOME/.cargo/bin/cargo" ]; then
    CARGO_PATH="$HOME/.cargo/bin/cargo"
fi

# Resolve absolute path to Rust workspace (al/ at repo root)
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
# ML_RUST_SRC env var overrides the default relative path (useful for standalone installs)
if [ -n "$ML_RUST_SRC" ] && [ -d "$ML_RUST_SRC" ]; then
    RUST_SRC="$ML_RUST_SRC"
else
    RUST_SRC=$(cd "$SCRIPT_DIR/../../al" 2>/dev/null && pwd || echo "")
fi

if [ -n "$CARGO_PATH" ] && [ -n "$RUST_SRC" ] && [ -d "$RUST_SRC/r" ]; then
    echo "* Found cargo: $CARGO_PATH"
    RUST_VERSION=$("$CARGO_PATH" --version 2>/dev/null)
    echo "* Rust version: $RUST_VERSION"
    echo "* Rust source: $RUST_SRC"

    # Build the Rust static library
    echo "* Building Rust backend..."
    cd "$RUST_SRC" && "$CARGO_PATH" build --release -p ml-r 2>&1
    RUST_BUILD_STATUS=$?

    if [ $RUST_BUILD_STATUS -eq 0 ] && [ -f "$RUST_SRC/target/release/libml_r.a" ]; then
        # Platform-specific link flags
        case "$(uname -s)" in
            Darwin) EXTRA_LIBS="-lSystem -lc -lm" ;;
            *)       EXTRA_LIBS="-lpthread -lm -ldl" ;;
        esac
        # Write Makevars with absolute paths
        cat > "$SCRIPT_DIR/src/Makevars" << MAKEVARS_EOF
# Generated by configure — do not edit
PKG_CFLAGS = -DML_HAS_RUST
PKG_LIBS = $RUST_SRC/target/release/libml_r.a $EXTRA_LIBS
MAKEVARS_EOF
        echo "* Using Rust backend"
    else
        echo "* Rust build failed — falling back to CRAN packages"
        cp src/Makevars.norust src/Makevars
    fi
else
    echo "* cargo not found or Rust source missing — building without Rust backend"
    echo "* Algorithms will use CRAN packages (ranger, rpart, kknn, etc.)"
    cp src/Makevars.norust src/Makevars
fi

exit 0
