#!/usr/bin/env bash
# End-to-end test: effect-handling counter, three FFI execution models.
#
# 1. Go FFI host    — Go fulfills timestamp + log effects
# 2. Java FFI host  — Java fulfills timestamp + log effects
# 3. Python FFI host— Python fulfills timestamp + log effects
#
# 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)"
EFFECTS_BRIDGE_DIR="$SCRIPT_DIR/effects_bridge"
GO_DIR="$SCRIPT_DIR/go_host"
JAVA_DIR="$SCRIPT_DIR/java_host"
PYTHON_DIR="$SCRIPT_DIR/python_host"
LIB_DIR="$EFFECTS_BRIDGE_DIR/target/debug"

echo "=== Step 1: Build Rust cdylib (effects_bridge) ==="
cargo build --manifest-path "$EFFECTS_BRIDGE_DIR/Cargo.toml"
echo

if [[ "$(uname)" == "Darwin" ]]; then
    export DYLD_LIBRARY_PATH="$LIB_DIR:${DYLD_LIBRARY_PATH:-}"
else
    export LD_LIBRARY_PATH="$LIB_DIR:${LD_LIBRARY_PATH:-}"
fi

echo "=== Step 2: Go host (effects) ==="
(cd "$GO_DIR" && go run .)
echo

echo "=== Step 3: Java host (effects) ==="
javac "$JAVA_DIR/EffectsHost.java" -d "$JAVA_DIR/out"
java -cp "$JAVA_DIR/out" "-Djava.library.path=$LIB_DIR" EffectsHost
echo

echo "=== Step 4: Python host (effects) ==="
python3 "$PYTHON_DIR/effects_host.py"
