#!/bin/bash
# start | stop | status

set +e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# shellcheck disable=SC1091
. "${SCRIPT_DIR}/common.sh"

export PATH="/var/apps/python312/target/bin:/usr/local/bin:/usr/bin:${PATH}"
export PYTHONUNBUFFERED=1
export PIP_NO_CACHE_DIR=1

PKGVAR="${TRIM_PKGVAR:-/tmp/ydkj-var}"
APPDEST="${TRIM_APPDEST:-.}"
PKGETC="${TRIM_PKGETC:-${PKGVAR}}"
mkdir -p "${PKGVAR}" 2>/dev/null || true

LOG_FILE="${PKGVAR}/info.log"
PID_FILE="${PKGVAR}/app.pid"
CONF_FILE="${PKGETC}/ydkj.env"
SITE="$(ydkj_site)"
PY="$(ydkj_python)"

# 向导端口优先，其次配置文件，再次系统注入
if [ -f "${CONF_FILE}" ]; then
  # shellcheck disable=SC1090
  . "${CONF_FILE}" 2>/dev/null || true
fi

PORT="${wizard_port:-${YDKJ_PORT:-${TRIM_SERVICE_PORT:-8787}}}"
case "${PORT}" in
  ''|*[!0-9]*) PORT=8787 ;;
esac
export YDKJ_PORT="${PORT}"
export YDKJ_HOST="0.0.0.0"
[ -n "${YDKJ_RECORD_DIR:-}" ] && export YDKJ_RECORD_DIR
export PYTHONPATH="${SITE}${PYTHONPATH:+:${PYTHONPATH}}"

# 持久化当前端口，供下次启动
mkdir -p "${PKGETC}" 2>/dev/null || true
{
  echo "YDKJ_PORT=${PORT}"
  echo "YDKJ_RECORD_DIR=${YDKJ_RECORD_DIR:-}"
} > "${CONF_FILE}"

log_msg() {
  echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "${LOG_FILE}" 2>/dev/null || true
}

is_running() {
  [ -f "${PID_FILE}" ] || return 1
  pid=$(head -n 1 "${PID_FILE}" 2>/dev/null | tr -d '[:space:]')
  [ -n "${pid}" ] || return 1
  kill -0 "${pid}" 2>/dev/null || return 1
  return 0
}

do_start() {
  if is_running; then
    exit 0
  fi

  if [ -z "${PY}" ] || [ ! -x "${PY}" ]; then
    ydkj_fail "未找到 Python 3.12。请先安装应用中心的 python312。"
    exit 1
  fi
  if [ ! -f "${APPDEST}/server/app.py" ]; then
    ydkj_fail "应用文件缺失: ${APPDEST}/server/app.py"
    exit 1
  fi

  # 缺 httpx 等关键依赖时强制重装
  if ! ydkj_deps_ok "${PY}" "${SITE}"; then
    log_msg "deps incomplete, force reinstall…"
    if ! ydkj_install_deps "${APPDEST}" 1; then
      exit 1
    fi
  fi

  [ -n "${YDKJ_RECORD_DIR:-}" ] && mkdir -p "${YDKJ_RECORD_DIR}" 2>/dev/null || true

  log_msg "starting py=${PY} port=${PORT} appdest=${APPDEST}"
  cd "${APPDEST}" || { ydkj_fail "无法进入 ${APPDEST}"; exit 1; }

  PYTHONPATH="${SITE}" YDKJ_PORT="${PORT}" YDKJ_HOST="0.0.0.0" \
    "${PY}" server/app.py >> "${LOG_FILE}" 2>&1 &
  echo "$!" > "${PID_FILE}"

  i=0
  while [ "${i}" -lt 8 ]; do
    sleep 1
    i=$((i + 1))
    if is_running; then
      sleep 1
      if is_running; then
        log_msg "started pid=$(cat "${PID_FILE}") port=${PORT}"
        exit 0
      fi
    fi
  done

  tail -n 40 "${LOG_FILE}" > "${TRIM_TEMP_LOGFILE:-/dev/null}" 2>/dev/null || true
  ydkj_fail "进程启动后退出。请查看日志: ${LOG_FILE}"
  exit 1
}

do_stop() {
  if [ -f "${PID_FILE}" ]; then
    pid=$(head -n 1 "${PID_FILE}" 2>/dev/null | tr -d '[:space:]')
    if [ -n "${pid}" ]; then
      kill -TERM "${pid}" 2>/dev/null || true
      sleep 1
      kill -KILL "${pid}" 2>/dev/null || true
    fi
    rm -f "${PID_FILE}"
  fi
  exit 0
}

do_status() {
  if is_running; then
    exit 0
  fi
  exit 3
}

case "${1:-}" in
  start) do_start ;;
  stop) do_stop ;;
  status) do_status ;;
  *) exit 3 ;;
esac
