#!/bin/sh
# DSM 7 lifecycle script.  Package Center invokes this as the package user,
# never as root.  Persistent state belongs in SYNOPKG_PKGVAR, not target.

PACKAGE_NAME="${SYNOPKG_PKGNAME:-FCEmulatorLibrary}"
PACKAGE_DEST="${SYNOPKG_PKGDEST:-/var/packages/${PACKAGE_NAME}/target}"
PACKAGE_VAR="${SYNOPKG_PKGVAR:-/var/packages/${PACKAGE_NAME}/var}"
APP_DIR="${PACKAGE_DEST}/app"
PID_FILE="${PACKAGE_VAR}/fc-emulator-library.pid"
LOG_FILE="${PACKAGE_VAR}/fc-emulator-library.log"
PORT="${FC_LIBRARY_PORT:-8282}"
HOST="${FC_LIBRARY_HOST:-0.0.0.0}"

resolve_node() {
  for candidate in \
    "${FC_LIBRARY_NODE_BIN:-}" \
    "${PACKAGE_DEST}/runtime/node" \
    "/var/packages/Node.js_v22/target/usr/local/bin/node" \
    "/var/packages/Node.js_v20/target/usr/local/bin/node" \
    "/var/packages/Node.js_v18/target/usr/local/bin/node" \
    "/var/packages/nodejs_v22/target/bin/node" \
    "/var/packages/nodejs_v20/target/bin/node" \
    "/var/packages/nodejs_v18/target/bin/node"; do
    if [ -n "${candidate}" ] && [ -x "${candidate}" ]; then
      echo "${candidate}"
      return 0
    fi
  done
  if command -v node >/dev/null 2>&1; then command -v node; return 0; fi
  return 1
}

check_node() {
  NODE_BIN="$(resolve_node)" || {
    echo "未找到 Node.js 18+。请安装 Synology Node.js 套件，或使用 build-public-spk.sh --node-bin 打入与 NAS 架构匹配的 Node。" >&2
    return 1
  }
  "${NODE_BIN}" -e 'process.exit(Number(process.versions.node.split(".")[0]) >= 18 ? 0 : 1)' || {
    echo "Node.js 版本过低：需要 Node.js 18 或更高版本。" >&2
    return 1
  }
}

is_running() {
  [ -s "${PID_FILE}" ] || return 1
  pid="$(cat "${PID_FILE}" 2>/dev/null)"
  [ -n "${pid}" ] && kill -0 "${pid}" 2>/dev/null
}

case "$1" in
  prestart)
    check_node
    ;;
  start)
    if is_running; then exit 0; fi
    check_node || exit 1
    mkdir -p "${PACKAGE_VAR}"
    NODE_BIN="$(resolve_node)"
    FC_LIBRARY_DATA_DIR="${PACKAGE_VAR}" \
    FC_LIBRARY_PORT="${PORT}" \
    FC_LIBRARY_HOST="${HOST}" \
    FC_LIBRARY_DIRECTORY_BROWSE_ROOT="${FC_LIBRARY_DIRECTORY_BROWSE_ROOT:-/}" \
    FC_LIBRARY_DIRECTORY_BROWSE_VOLUMES_ONLY="${FC_LIBRARY_DIRECTORY_BROWSE_VOLUMES_ONLY:-yes}" \
    "${NODE_BIN}" "${APP_DIR}/server.js" >>"${LOG_FILE}" 2>&1 &
    echo $! >"${PID_FILE}"
    sleep 1
    if ! is_running; then
      rm -f "${PID_FILE}"
      echo "服务未能启动，请查看 ${LOG_FILE}。" >&2
      exit 1
    fi
    ;;
  prestop)
    exit 0
    ;;
  stop)
    if ! [ -s "${PID_FILE}" ]; then exit 0; fi
    pid="$(cat "${PID_FILE}" 2>/dev/null)"
    if [ -n "${pid}" ]; then
      kill "${pid}" 2>/dev/null || true
      attempt=0
      while kill -0 "${pid}" 2>/dev/null && [ "${attempt}" -lt 10 ]; do sleep 1; attempt=$((attempt + 1)); done
      kill -9 "${pid}" 2>/dev/null || true
    fi
    rm -f "${PID_FILE}"
    ;;
  status)
    if is_running; then exit 0; fi
    if [ -e "${PID_FILE}" ]; then exit 1; fi
    exit 3
    ;;
  *)
    exit 1
    ;;
esac

exit 0
