#!/usr/bin/env bash
# End-to-end test: key-value store with host-provided storage effects.
#
# 1. Go FFI host    — Go fulfills Get/Put/Delete/List effects
# 2. Java FFI host  — Java fulfills Get/Put/Delete/List effects
# 3. Python FFI host— Python fulfills Get/Put/Delete/List 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)"
KV_BRIDGE_DIR="$SCRIPT_DIR/kv_bridge"
GO_DIR="$SCRIPT_DIR/go_host"
JAVA_DIR="$SCRIPT_DIR/java_host"
PYTHON_DIR="$SCRIPT_DIR/python_host"
LIB_DIR="$KV_BRIDGE_DIR/target/debug"

echo "=== Step 1: Build Rust cdylib (kv_bridge) ==="
cargo build --manifest-path "$KV_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 (key-value store) ==="
(cd "$GO_DIR" && go run .)
echo

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

echo "=== Step 4: Python host (key-value store) ==="
python3 "$PYTHON_DIR/kv_host.py"
