#!/usr/bin/env sh
set -eu

app_env="$(printf '%s' "${APP_ENV:-development}" | tr '[:upper:]' '[:lower:]')"

if [ -z "${VITE_DEVFRONT_PUBLIC_URL:-}" ] && [ -n "${DEVFRONT_URL:-}" ]; then
  export VITE_DEVFRONT_PUBLIC_URL="$DEVFRONT_URL"
fi

if [ -z "${VITE_DEVFRONT_PUBLIC_URL:-}" ] && [ -n "${DEVFRONT_CALLBACK_URLS:-}" ]; then
  first_devfront_callback="${DEVFRONT_CALLBACK_URLS%%,*}"
  case "$first_devfront_callback" in
    http://*/auth/callback | https://*/auth/callback)
      export VITE_DEVFRONT_PUBLIC_URL="${first_devfront_callback%/auth/callback}"
      ;;
  esac
fi

case "$app_env" in
  production|prod|stage|staging)
    mode="production"
    ;;
  *)
    mode="development"
    ;;
esac

if [ "${1:-}" = "--print-public-url" ]; then
  printf '%s\n' "${VITE_DEVFRONT_PUBLIC_URL:-}"
  exit 0
fi

if [ "${1:-}" = "--print-mode" ]; then
  printf '%s\n' "$mode"
  exit 0
fi

ensure_frontend_dependencies() {
  APP_WORKSPACE_FILTER="../devfront"

  # If common workspace exists, manage dependencies from the real workspace tree.
  if [ -d /workspace/common ] && [ -f /workspace/common/package.json ]; then
    WORKSPACE_DIR="/workspace/common"
    LOCK_FILE="/workspace/common/pnpm-lock.yaml"
  else
    WORKSPACE_DIR="."
    LOCK_FILE="package-lock.json"
  fi

  if [ ! -f "$WORKSPACE_DIR/package.json" ]; then
    return 0
  fi

  lock_mode=""
  lock_file="$WORKSPACE_DIR/.baron-deps-install.lock"

  acquire_install_lock() {
    if command -v flock >/dev/null 2>&1; then
      lock_mode="flock"
      exec 9>"$lock_file"
      flock 9
      trap 'release_install_lock' EXIT INT TERM
      return 0
    fi

    lock_mode="mkdir"
    while ! mkdir "$lock_file" 2>/dev/null; do
      sleep 1
    done
    trap 'release_install_lock' EXIT INT TERM
  }

  release_install_lock() {
    trap - EXIT INT TERM

    if [ "$lock_mode" = "flock" ]; then
      flock -u 9 || true
      exec 9>&-
      return 0
    fi

    if [ "$lock_mode" = "mkdir" ]; then
      rmdir "$lock_file" >/dev/null 2>&1 || true
    fi
  }

  if command -v sha256sum >/dev/null 2>&1; then
    deps_hash="$(sha256sum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" 2>/dev/null | sha256sum | awk '{print $1}')"
  else
    deps_hash="$(cksum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" 2>/dev/null | cksum | awk '{print $1}')"
  fi
  deps_stamp="node_modules/.baron-deps-hash"
  installed_hash="$(cat "$deps_stamp" 2>/dev/null || true)"

  if [ "$installed_hash" != "$deps_hash" ]; then
    echo "Installing frontend dependencies..."
    acquire_install_lock
    if command -v sha256sum >/dev/null 2>&1; then
      deps_hash="$(sha256sum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" 2>/dev/null | sha256sum | awk '{print $1}')"
    else
      deps_hash="$(cksum "$WORKSPACE_DIR/package.json" "$LOCK_FILE" 2>/dev/null | cksum | awk '{print $1}')"
    fi
    installed_hash="$(cat "$deps_stamp" 2>/dev/null || true)"
    if [ "$installed_hash" = "$deps_hash" ]; then
      release_install_lock
      return 0
    fi
    if [ "$WORKSPACE_DIR" = "/workspace/common" ]; then
      (cd /workspace/common && pnpm install --filter "${APP_WORKSPACE_FILTER}..." --frozen-lockfile --ignore-scripts)
    else
      npm ci
    fi
    mkdir -p node_modules
    printf '%s\n' "$deps_hash" > "$deps_stamp"
    release_install_lock
  fi
}

ensure_frontend_dependencies

if [ "$mode" = "production" ]; then
  echo "Running in production mode with Vite preview..."
  exec sh -c "npm run build && npm run preview -- --host 0.0.0.0"
fi

echo "Running in development mode..."
exec npm run dev -- --host 0.0.0.0
