#!/bin/bash
set -euo pipefail

if [[ $# -lt 1 ]]; then
    echo "Usage: smartsim-openfoam-exec <solver> [solver arguments ...]" >&2
    exit 2
fi

if [[ -n "${SMARTSIM_ENV_LOADER:-}" ]]; then
    if [[ ! -f "$SMARTSIM_ENV_LOADER" ]]; then
        echo "ERROR: SmartSim environment loader was not found:" >&2
        echo "       $SMARTSIM_ENV_LOADER" >&2
        exit 1
    fi

    export SMARTSIM_ENV_QUIET=1
    source "$SMARTSIM_ENV_LOADER"
    unset SMARTSIM_ENV_QUIET
fi

required_variables=(
    FOAM_USER_APPBIN
    FOAM_USER_LIBBIN
    FOAM_APPBIN
    FOAM_LIBBIN
    SMARTREDIS_DIR
)

for variable_name in "${required_variables[@]}"; do
    if [[ -z "${!variable_name:-}" ]]; then
        echo "ERROR: OpenFOAM SmartSim environment is incomplete." >&2
        echo "       Missing variable: $variable_name" >&2
        echo "       Activate OpenFOAM or set SMARTSIM_ENV_LOADER." >&2
        exit 1
    fi
done

smartredis_lib_dir="$SMARTREDIS_DIR/install/lib64"

if [[ ! -d "$smartredis_lib_dir" ]]; then
    smartredis_lib_dir="$SMARTREDIS_DIR/install/lib"
fi

if [[ ! -d "$smartredis_lib_dir" ]]; then
    echo "ERROR: SmartRedis library directory was not found under:" >&2
    echo "       $SMARTREDIS_DIR/install" >&2
    exit 1
fi

export PATH="$FOAM_USER_APPBIN:$FOAM_APPBIN${PATH:+:$PATH}"

case "$(uname -s)" in
    Darwin)
        export DYLD_LIBRARY_PATH="$FOAM_USER_LIBBIN:$FOAM_LIBBIN:$smartredis_lib_dir${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}"
        ;;
    *)
        export LD_LIBRARY_PATH="$FOAM_USER_LIBBIN:$FOAM_LIBBIN:$smartredis_lib_dir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
        ;;
esac

solver="$1"
shift

solver_path="$FOAM_APPBIN/$solver"

if [[ ! -x "$solver_path" ]]; then
    solver_path="$FOAM_USER_APPBIN/$solver"
fi

if [[ ! -x "$solver_path" ]]; then
    echo "ERROR: OpenFOAM solver or executable was not found:" >&2
    echo "       Solver:           $solver" >&2
    echo "       FOAM_APPBIN:      $FOAM_APPBIN" >&2
    echo "       FOAM_USER_APPBIN: $FOAM_USER_APPBIN" >&2
    exit 127
fi

exec "$solver_path" "$@"
