#!/bin/bash
# Own process group only. fnOS owns service supervision and calls status.
set -u
export PATH="/var/apps/python312/target/bin:$PATH"
APPBIN="$TRIM_APPDEST/src/autoproxy.py"
CONFIG="$TRIM_PKGETC/config.json"
VARDIR="$TRIM_PKGVAR"
PIDFILE="$VARDIR/service.pid"
SOCK="$TRIM_APPDEST/autoproxy.sock"
fail() {
  printf '%s\n' "$1" >&2
  [ -z "${TRIM_TEMP_LOGFILE:-}" ] || printf '%s\n' "$1" > "$TRIM_TEMP_LOGFILE"
  exit 1
}
is_running() {
  [ -f "$PIDFILE" ] || return 1
  read -r APPPID STARTTIME < "$PIDFILE"
  case "$APPPID" in ''|*[!0-9]*) return 1;; esac
  [ -r "/proc/$APPPID/stat" ] || return 1
  [ "$(awk '{print $22}' "/proc/$APPPID/stat")" = "$STARTTIME" ] || return 1
  tr '\0' '\n' < "/proc/$APPPID/cmdline" | grep -Fxq "$APPBIN"
}
case "${1:-}" in
  start)
    mkdir -p "$VARDIR" || fail "无法创建应用运行目录"
    is_running && exit 0
    [ -x /var/apps/python312/target/bin/python3 ] || fail "缺少 python312 运行时"
    [ -f "$CONFIG" ] || python3 "$TRIM_APPDEST/bin/write_config.py" "$CONFIG" || fail "配置写入失败"
    if [ "$(id -u)" = 0 ]; then
      chown "${TRIM_USERNAME:-autoproxy}:${TRIM_GROUPNAME:-autoproxy}" "$VARDIR" "$TRIM_PKGETC" "$CONFIG" "$TRIM_APPDEST" || fail "应用目录权限准备失败"
      nohup setsid runuser -u "${TRIM_USERNAME:-autoproxy}" -- python3 "$APPBIN" --config "$CONFIG" --var "$VARDIR" --web "$TRIM_APPDEST/web/index.html" --socket "$SOCK" >> "$VARDIR/service.log" 2>&1 < /dev/null &
    else
      nohup setsid python3 "$APPBIN" --config "$CONFIG" --var "$VARDIR" --web "$TRIM_APPDEST/web/index.html" --socket "$SOCK" >> "$VARDIR/service.log" 2>&1 < /dev/null &
    fi
    APPPID=$!
    [ -r "/proc/$APPPID/stat" ] || fail "服务启动失败，请查看 service.log"
    printf '%s %s\n' "$APPPID" "$(awk '{print $22}' "/proc/$APPPID/stat")" > "$PIDFILE"
    for ((i=0;i<45;i++)); do
      if is_running && [ -S "$SOCK" ]; then exit 0; fi
      kill -0 "$APPPID" 2>/dev/null || fail "服务退出，请查看 service.log"
      sleep 1
    done
    fail "服务启动超时，请查看 service.log"
    ;;
  stop)
    if is_running; then
      kill -TERM -- "-$APPPID" 2>/dev/null || true
      for ((i=0;i<35;i++)); do
        is_running || break
        sleep 1
      done
      if is_running; then kill -KILL -- "-$APPPID" 2>/dev/null || true; fi
    fi
    rm -f "$PIDFILE" "$SOCK"
    exit 0
    ;;
  status) is_running && [ -S "$SOCK" ] && exit 0; exit 3;;
  *) fail "用法：main start|stop|status";;
esac
