#!/bin/bash
#
# Unix (macOS/Linux) command line interface for Juggling Lab
#
# Copyright 2002-2025 Jack Boyce and the Juggling Lab contributors
# Released under the GNU General Public License v2


DIR=$(dirname "$0")
JL_JAR="${DIR}/JugglingLab.jar"
JL_WORKING_DIR="$(pwd)"
export JL_WORKING_DIR

if [[ "$OSTYPE" == "darwin"* ]]; then
    # Running on macOS
    # First try launching in JugglingLab.jar in same directory
    if [ -a "${JL_JAR}" ]; then
        if type java >/dev/null 2>&1; then
            _java=java
        elif [[ -n "${JAVA_HOME}" ]] && [[ -x "${JAVA_HOME}/bin/java" ]]; then
            _java="${JAVA_HOME}/bin/java"
        fi

        if [[ "$_java" ]]; then
            version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
            version1=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}')
            if [ "$version1" -ge "011000" ]; then
                architecture=$(uname -m)
                if [[ "$architecture" == "arm64" ]]; then
                    ortools_path="${DIR}/ortools-lib/ortools-darwin-aarch64"
                elif [[ "$architecture" == "x86_64" ]]; then
                    ortools_path="${DIR}/ortools-lib/ortools-darwin-x86-64"
                fi
                if [[ $# -ne 0 ]]; then
                    "$_java" -cp "${JL_JAR}" -Xss2048k \
                        -Djava.library.path="${ortools_path}" \
                        --enable-native-access=ALL-UNNAMED jugglinglab.JugglingLabKt ${1+"$@"}
                    exit 1
                else
                    # print a help message if no command line args
                    "$_java" -cp "${JL_JAR}" jugglinglab.JugglingLabKt help
                    exit 1
                fi
            fi
        fi
    fi

    # Otherwise try launching in the application bundle
    OSX_JL_EXEC="${DIR}/Juggling Lab.app/Contents/MacOS/Juggling Lab"
    if ! [[ -x "${OSX_JL_EXEC}" ]]; then
        OSX_JL_EXEC="/Applications/Juggling Lab.app/Contents/MacOS/Juggling Lab"
    fi

    if [[ -x "${OSX_JL_EXEC}" ]]; then
        if [[ $# -ne 0 ]]; then
            "${OSX_JL_EXEC}" ${1+"$@"}
            exit 1
        else
            # print a help message if no command line args
            "${OSX_JL_EXEC}" help
            exit 1
        fi
    fi

    echo >&2 "\"Juggling Lab.app\" not found."
else
    # Running on other Unix
    # First try launching in JugglingLab.jar in same directory
    if [ -a "${JL_JAR}" ]; then
        if type java >/dev/null 2>&1; then
            _java=java
        elif [[ -n "${JAVA_HOME}" ]] && [[ -x "${JAVA_HOME}/bin/java" ]]; then
            _java="${JAVA_HOME}/bin/java"
        fi

        if [[ "$_java" ]]; then
            version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
            version1=$(echo "$version" | awk -F. '{printf("%03d%03d",$1,$2);}')
            if [ "$version1" -ge "011000" ]; then
                if [[ $# -ne 0 ]]; then
                    # include both x86 and Arm versions of OR-Tools
                    # JRE will choose correct one at runtime
                    "$_java" -cp "${JL_JAR}" -Xss2048k \
                        -Djava.library.path="${DIR}/ortools-lib/ortools-linux-x86-64:${DIR}/ortools-lib/ortools-linux-aarch64" \
                        --enable-native-access=ALL-UNNAMED jugglinglab.JugglingLabKt ${1+"$@"}
                    exit 1
                else
                    # print a help message if no command line args
                    "$_java" -cp "${JL_JAR}" jugglinglab.JugglingLabKt help
                    exit 1
                fi
            fi
        fi
    fi

    # Otherwise try launching in the application bundle
    UNIX_JL_EXEC="/opt/juggling-lab/bin/Juggling Lab"
    if [[ -x "${UNIX_JL_EXEC}" ]]; then
        if [[ $# -ne 0 ]]; then
            "${UNIX_JL_EXEC}" ${1+"$@"}
            exit 1
        else
            # print a help message if no command line args
            "${UNIX_JL_EXEC}" help
            exit 1
        fi
    fi

    echo >&2 "\"Juggling Lab\" executable not found."
fi
