#!/usr/bin/env bash
# LasPoly launcher — one file to download. Fetches the game jar, Java 21, and OpenJFX if needed.
set -euo pipefail

ROOT="$(cd "$(dirname "$0")" && pwd)"
JAR="$ROOT/LasPoly.jar"
ORIGIN="${LASPOLY_ORIGIN:-https://laspoly.brianwirth.de}"
JAR_URL="$ORIGIN/download/LasPoly.jar"
JAVA_VERSION="${LASPOLY_JAVA_VERSION:-21}"
JFX_VERSION="${JFX_VERSION:-21.0.2}"
CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/laspoly"
JRE_DIR="$CACHE/temurin-jre-$JAVA_VERSION"
JFX_CACHE="$CACHE/javafx-sdk-$JFX_VERSION"

java_major() {
  "$1" -version 2>&1 | sed -n 's/.*version "\([0-9][0-9]*\).*/\1/p' | head -1
}

ensure_java() {
  if command -v java >/dev/null 2>&1; then
    local major
    major="$(java_major java)"
    if [[ -n "$major" && "$major" -ge "$JAVA_VERSION" ]]; then
      echo java
      return
    fi
  fi
  if [[ -x "$JRE_DIR/bin/java" ]]; then
    local major
    major="$(java_major "$JRE_DIR/bin/java")"
    if [[ -n "$major" && "$major" -ge "$JAVA_VERSION" ]]; then
      echo "$JRE_DIR/bin/java"
      return
    fi
  fi

  local os arch adopt_os adopt_arch
  os="$(uname -s)"
  arch="$(uname -m)"
  case "$os-$arch" in
    Linux-x86_64|Linux-amd64) adopt_os=linux; adopt_arch=x64 ;;
    Linux-aarch64|Linux-arm64) adopt_os=linux; adopt_arch=aarch64 ;;
    Darwin-x86_64) adopt_os=mac; adopt_arch=x64 ;;
    Darwin-arm64) adopt_os=mac; adopt_arch=aarch64 ;;
    *) echo "Unsupported OS/arch for auto Java install: $os $arch" >&2; exit 1 ;;
  esac

  echo "Downloading Eclipse Temurin $JAVA_VERSION ($adopt_os $adopt_arch) ..."
  mkdir -p "$CACHE"
  tmp="$(mktemp)"
  curl -fsSL -o "$tmp" \
    "https://api.adoptium.net/v3/binary/latest/${JAVA_VERSION}/ga/${adopt_os}/${adopt_arch}/jre/hotspot/normal/eclipse?project=jdk"
  rm -rf "$JRE_DIR"
  mkdir -p "$JRE_DIR"
  python3 -m zipfile -e "$tmp" "$CACHE"
  rm -f "$tmp"
  extracted="$(find "$CACHE" -maxdepth 1 -type d -name 'jdk-*' | head -1)"
  if [[ -n "$extracted" && "$extracted" != "$JRE_DIR" ]]; then
    rm -rf "$JRE_DIR"
    mv "$extracted" "$JRE_DIR"
  fi
  echo "$JRE_DIR/bin/java"
}

ensure_javafx() {
  local jfx_tag
  local os arch
  os="$(uname -s)"
  arch="$(uname -m)"
  case "$os-$arch" in
    Linux-x86_64|Linux-amd64) jfx_tag=linux ;;
    Linux-aarch64|Linux-arm64) jfx_tag=linux-aarch64 ;;
    Darwin-x86_64) jfx_tag=osx ;;
    Darwin-arm64) jfx_tag=osx-aarch64 ;;
    *) echo "Unsupported OS/arch for OpenJFX: $os $arch" >&2; exit 1 ;;
  esac

  if [[ -d "$JFX_CACHE/lib" ]]; then
    return
  fi

  echo "Downloading OpenJFX $JFX_VERSION ($jfx_tag) ..."
  mkdir -p "$(dirname "$JFX_CACHE")"
  tmp="$(mktemp)"
  curl -fsSL -o "$tmp" \
    "https://download2.gluonhq.com/openjfx/$JFX_VERSION/openjfx-${JFX_VERSION}_${jfx_tag}-x64_bin-sdk.zip"
  rm -rf "$JFX_CACHE"
  mkdir -p "$JFX_CACHE"
  python3 -m zipfile -e "$tmp" "$(dirname "$JFX_CACHE")"
  rm -f "$tmp"
  extracted="$(find "$(dirname "$JFX_CACHE")" -maxdepth 1 -type d -name "javafx-sdk-$JFX_VERSION" | head -1)"
  if [[ -n "$extracted" && "$extracted" != "$JFX_CACHE" ]]; then
    mv "$extracted" "$JFX_CACHE"
  fi
}

if [[ ! -f "$JAR" ]]; then
  echo "Downloading LasPoly.jar ..."
  curl -fsSL -o "$JAR" "$JAR_URL"
fi

JAVA="$(ensure_java)"
ensure_javafx

echo "Starting LasPoly ..."
exec "$JAVA" \
  --module-path "$JFX_CACHE/lib" \
  --add-modules javafx.controls,javafx.fxml,javafx.graphics,javafx.media,javafx.swing,javafx.web \
  -cp "$JAR" \
  de.hhn.seb.labsw.laspoly.main.Main
