#!/bin/sh

#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
#
#   ApiHug start up script for POSIX generated by Gradle.
#
#   Important for running:
#
#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
#       noncompliant, but you have some other compliant shell such as ksh or
#       bash, then to run this script, type that shell name before the whole
#       command line, like:
#
#           ksh ApiHug
#
#       Busybox and similar reduced shells will NOT work, because this script
#       requires all of these POSIX shell features:
#         * functions;
#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
#         * compound commands having a testable exit status, especially «case»;
#         * various built-in commands including «command», «set», and «ulimit».
#
#   Important for patching:
#
#   (2) This script targets any POSIX shell, so it avoids extensions provided
#       by Bash, Ksh, etc; in particular arrays are avoided.
#
#       The "traditional" practice of packing multiple parameters into a
#       space-separated string is a well documented source of bugs and security
#       problems, so this is (mostly) avoided, by progressively accumulating
#       options in "$@", and eventually passing that to Java.
#
#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS)
#       rely on word-splitting, this is performed explicitly;
#       see the in-line comments for details.
#
#       There are tweaks for specific operating systems such as AIX, CygWin,
#       Darwin, MinGW, and NonStop.
#
#   (3) This script is generated from the Groovy template
#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
#       within the Gradle project.
#
#       You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# Attempt to set APP_HOME

# Resolve links: $0 may be a link
app_path=$0

# Need this for daisy-chained symlinks.
while
    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
    [ -h "$app_path" ]
do
    ls=$( ls -ld "$app_path" )
    link=${ls#*' -> '}
    case $link in             #(
      /*)   app_path=$link ;; #(
      *)    app_path=$APP_HOME$link ;;
    esac
done

APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

APP_NAME="ApiHug"
APP_BASE_NAME=${0##*/}

# Add default JVM options here. You can also use JAVA_OPTS to pass JVM options to this script.
# Note: --enable-native-access is required for JLine terminal on Java 22+
# -Dorg.jline.terminal.provider=jni forces JNI provider for better compatibility
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m" "-Dorg.jline.terminal.provider=jni" "--enable-native-access=ALL-UNNAMED"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

warn () {
    echo "$*"
} >&2

die () {
    echo
    echo "$*"
    echo
    exit 1
} >&2

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in                #(
  CYGWIN* )         cygwin=true  ;; #(
  Darwin* )         darwin=true  ;; #(
  MSYS* | MINGW* )  msys=true    ;; #(
  NONSTOP* )        nonstop=true ;;
esac

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD=$JAVA_HOME/jre/sh/java
    else
        JAVACMD=$JAVA_HOME/bin/java
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD=java
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
    case $MAX_FD in #(
      max*)
        MAX_FD=$( ulimit -H -n ) ||
            warn "Could not query maximum file descriptor limit"
    esac
    case $MAX_FD in  #(
      '' | soft) :;; #(
      *)
        ulimit -n "$MAX_FD" ||
            warn "Could not set maximum file descriptor limit to $MAX_FD"
    esac
fi

# Setup the ApiHug directory
APIHUG_DIR="$APP_HOME/.apihug"
APIHUG_JAR="$APIHUG_DIR/it-repl.jar"

# Maven coordinates
GROUP_ID="com.apihug"
ARTIFACT_ID="it-repl"

# Read version from gradle/libs.versions.toml
VERSION_FILE="$APP_HOME/gradle/libs.versions.toml"
VERSION="2.5.5-RELEASE"

if [ -f "$VERSION_FILE" ] ; then
    # Extract version from toml file
    VERSION_LINE=$( grep -E '^apihug[ ]*=' "$VERSION_FILE" | head -n 1 )
    if [ -n "$VERSION_LINE" ] ; then
        # Extract value after '=' and remove quotes and spaces
        VERSION=$( echo "$VERSION_LINE" | sed -e 's/^[^=]*=[ ]*//g' -e 's/"//g' -e 's/ //g' )
    fi
fi

echo ""
echo "ApiHug Version: $VERSION"
echo ""

# Check if .apihug directory exists, if not create it
if [ ! -d "$APIHUG_DIR" ] ; then
    mkdir -p "$APIHUG_DIR"
fi

# Check version and force refresh if needed
VERSION_CACHE_FILE="$APIHUG_DIR/.version"
NEED_DOWNLOAD=0

# Check if jar exists
if [ ! -f "$APIHUG_JAR" ] ; then
    NEED_DOWNLOAD=1
fi

# Check if version has changed
if [ -f "$VERSION_CACHE_FILE" ] ; then
    CACHED_VERSION=$( cat "$VERSION_CACHE_FILE" )
    if [ "$CACHED_VERSION" != "$VERSION" ] ; then
        echo ""
        echo "Version changed: $CACHED_VERSION -> $VERSION"
        echo ""
        NEED_DOWNLOAD=1
    fi
else
    NEED_DOWNLOAD=1
fi

# Check for force refresh arguments
for arg in "$@"; do
    case $arg in
        --refresh|-r|--force)
            NEED_DOWNLOAD=1
            ;;
    esac
done

# Download if needed
if [ $NEED_DOWNLOAD -eq 1 ] ; then
    echo "Downloading it-repl.jar via gradlew hope..."
    echo ""

    [ ! -f "$APP_HOME/gradlew" ] && die "ERROR: gradlew not found in $APP_HOME"

    "$APP_HOME/gradlew" hope || die "ERROR: Failed to run gradlew hope"

    [ ! -f "$APIHUG_JAR" ] && die "ERROR: it-repl.jar not found after running gradlew hope"

    # Save current version to cache
    echo "$VERSION" > "$VERSION_CACHE_FILE"
    echo ""
fi

echo ""
echo "Starting ApiHug REPL..."
echo ""

# Note: --enable-native-access is required for JLine terminal on Java 22+
# -Dorg.jline.terminal.provider=jni forces JNI provider for better compatibility
exec "$JAVACMD" \
    -Xmx64m \
    -Xms64m \
    -Dorg.jline.terminal.provider=jni \
    --enable-native-access=ALL-UNNAMED \
    $JAVA_OPTS \
    -jar "$APIHUG_JAR" \
    "$@"
