#!/usr/bin/env bash
# End-to-end test: same Counter trait, four execution models.
#
# 1. Tokio host     — Rust async runtime drives Sendable futures
# 2. Go FFI host    — Go drives Sendable futures via PollOnce
# 3. Java FFI host  — Java drives Sendable futures via JNI + PollOnce
# 4. Python FFI host— Python drives Sendable futures via ctypes + PollOnce
#
# Expects `cargo`, `go`, `javac`, `java`, and `python3` on $PATH.
# Use `nix develop .#ffi` to get a shell with all of them.

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
RUST_BRIDGE_DIR="$SCRIPT_DIR/rust_bridge"
TOKIO_HOST_DIR="$SCRIPT_DIR/tokio_host"
GO_DIR="$SCRIPT_DIR/go_host"
JAVA_DIR="$SCRIPT_DIR/java_host"
PYTHON_DIR="$SCRIPT_DIR/python_host"
LIB_DIR="$RUST_BRIDGE_DIR/target/debug"

echo "=== Step 1: Tokio host (Sendable) ==="
cargo run --manifest-path "$TOKIO_HOST_DIR/Cargo.toml"
echo

echo "=== Step 2: Build Rust cdylib ==="
cargo build --manifest-path "$RUST_BRIDGE_DIR/Cargo.toml"
echo

echo "=== Step 3: Go host (Sendable + PollOnce via FFI) ==="
if [[ "$(uname)" == "Darwin" ]]; then
    export DYLD_LIBRARY_PATH="$LIB_DIR:${DYLD_LIBRARY_PATH:-}"
else
    export LD_LIBRARY_PATH="$LIB_DIR:${LD_LIBRARY_PATH:-}"
fi

(cd "$GO_DIR" && go run .)
echo

echo "=== Step 4: Java host (Sendable + PollOnce via JNI) ==="
javac "$JAVA_DIR/CounterHost.java" -d "$JAVA_DIR/out"
java -cp "$JAVA_DIR/out" "-Djava.library.path=$LIB_DIR" CounterHost
echo

echo "=== Step 5: Python host (Sendable + PollOnce via ctypes) ==="
python3 "$PYTHON_DIR/counter_host.py"
