#!/usr/bin/env bash
# Shebang header for korapxmltool: auto-enables native access (Java 25+) and chooses a default -Xmx.
# Usage:
#   cat korapxmltool.shebang app/build/libs/korapxmltool.jar > korapxmltool
#   chmod +x korapxmltool
# (Run `zip -A korapxmltool` if your unzip/java complains about prepended bytes.)
#
# Override memory:
#   export KORAPXMLTOOL_XMX=20g              # sets -Xmx20g
#   export KORAPXMLTOOL_XMX=8192m            # sets -Xmx8192m
#   export KORAPXMLTOOL_JAVA_OPTS="... -Xmx4g"  # full custom opts
# Otherwise we pick ~75% of detected memory (cgroup aware), clamped to [1024m, 65536m].

set -euo pipefail

has_xmx=false
for v in "${JDK_JAVA_OPTIONS:-}" "${JAVA_TOOL_OPTIONS:-}" "${KORAPXMLTOOL_JAVA_OPTS:-}"; do
  [[ $v == *"-Xmx"* ]] && has_xmx=true && break
done
for arg in "$@"; do
  [[ $arg == -Xmx* ]] && has_xmx=true && break
done

detect_mem_limit_mb() {
  local cgroup_limit
  if [[ -f /sys/fs/cgroup/memory.max ]]; then
    cgroup_limit=$(< /sys/fs/cgroup/memory.max)
    [[ $cgroup_limit == "max" ]] && cgroup_limit=""
  elif [[ -f /sys/fs/cgroup/memory/memory.limit_in_bytes ]]; then
    cgroup_limit=$(< /sys/fs/cgroup/memory/memory.limit_in_bytes)
  fi

  local limit_mb=""
  if [[ -n ${cgroup_limit:-} && $cgroup_limit =~ ^[0-9]+$ && $cgroup_limit -lt 9223372036854771712 ]]; then
    limit_mb=$(( cgroup_limit / 1024 / 1024 ))
  fi

  local memtotal_kb
  memtotal_kb=$(awk '/MemTotal/ { print $2; exit }' /proc/meminfo 2>/dev/null || echo "")
  local total_mb=""
  if [[ $memtotal_kb =~ ^[0-9]+$ ]]; then
    total_mb=$(( memtotal_kb / 1024 ))
  fi

  if [[ -n $limit_mb && -n $total_mb ]]; then
    (( limit_mb < total_mb )) && echo "$limit_mb" || echo "$total_mb"
  else
    echo "${limit_mb:-${total_mb:-4096}}"
  fi
}

EXTRA_OPTS=()
if [[ "${JDK_JAVA_OPTIONS:-}" != *"--enable-native-access="* ]]; then
  EXTRA_OPTS+=(--enable-native-access=ALL-UNNAMED)
fi

if ! $has_xmx; then
  if [[ -n ${KORAPXMLTOOL_XMX:-} ]]; then
    # Handle KORAPXMLTOOL_XMX with units (g/G for GB, m/M for MB, or just number for MB)
    if [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+[gG]$ ]]; then
      # Convert GB to MB
      xmx_gb=${KORAPXMLTOOL_XMX%[gG]}
      xmx_mb=$((xmx_gb * 1024))
    elif [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+[mM]$ ]]; then
      # Extract MB value
      xmx_mb=${KORAPXMLTOOL_XMX%[mM]}
    elif [[ ${KORAPXMLTOOL_XMX} =~ ^[0-9]+$ ]]; then
      # Treat plain number as MB for backward compatibility
      xmx_mb=${KORAPXMLTOOL_XMX}
    else
      echo "Warning: Invalid KORAPXMLTOOL_XMX format '${KORAPXMLTOOL_XMX}'. Use formats like '20g', '8192m', or '8192'." >&2
      xmx_mb=""
    fi
  fi
  
  # If no valid XMX was provided or parsing failed, use auto-detection
  if [[ -z ${xmx_mb:-} ]]; then
    mem_mb=$(detect_mem_limit_mb)
    xmx_mb=$(( mem_mb * 75 / 100 ))
    (( xmx_mb < 1024 )) && xmx_mb=1024
    (( xmx_mb > 65536 )) && xmx_mb=65536
  fi
  EXTRA_OPTS+=("-Xmx${xmx_mb}m")
fi

# Set default KORAPXMLTOOL_MODELS_PATH relative to executable if not already set
if [[ -z ${KORAPXMLTOOL_MODELS_PATH:-} ]]; then
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
  export KORAPXMLTOOL_MODELS_PATH="${SCRIPT_DIR}/../lib/models"
fi

exec java "${EXTRA_OPTS[@]}" ${KORAPXMLTOOL_JAVA_OPTS:-} -jar "$0" "$@"
