#!/bin/bash
set -u

LOG_FILE="${TRIM_PKGVAR}/info.log"
PID_FILE="${TRIM_PKGVAR}/app.pid"
CMD="${TRIM_APPDEST}/server/dy.net"
DATA_ROOT="${TRIM_APPDEST_VOL}/@appshare/dy.net"

log_msg() {
    printf '%s - %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >> "${LOG_FILE}"
}

running_pid() {
    if [ -f "${PID_FILE}" ]; then
        pid=$(head -n 1 "${PID_FILE}" | tr -d '[:space:]')
        if [ -n "${pid}" ] && kill -0 "${pid}" 2>/dev/null; then
            printf '%s' "${pid}"
            return 0
        fi
    fi
    return 1
}

start_process() {
    if [ ! -x "${CMD}" ]; then
        log_msg "程序不存在或不可执行：${CMD}"
        exit 1
    fi
    mkdir -p "${TRIM_PKGVAR}" "${TRIM_PKGVAR}/.net-bundle" "${DATA_ROOT}"
    if pid=$(running_pid); then
        log_msg "程序已运行，PID ${pid}"
        return 0
    fi
    (
        export LC_ALL=C.UTF-8
        export LANG=C.UTF-8
        export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
        # fnOS package accounts may not have HOME. Keep any future single-file native
        # extraction in the package's writable var directory instead of ~/.net.
        export DOTNET_BUNDLE_EXTRACT_BASE_DIR="${TRIM_PKGVAR}/.net-bundle"
        cd "$(dirname "${CMD}")" || exit 1
        exec "${CMD}" "${DATA_ROOT}"
    ) >> "${LOG_FILE}" 2>&1 &
    pid=$!
    sleep 1
    if kill -0 "${pid}" 2>/dev/null; then
        printf '%s' "${pid}" > "${PID_FILE}"
        log_msg "程序启动成功，PID ${pid}"
    else
        log_msg "程序启动失败，请检查日志"
        exit 1
    fi
}

stop_process() {
    if ! pid=$(running_pid); then
        rm -f "${PID_FILE}"
        return 0
    fi
    kill "${pid}" 2>/dev/null || true
    count=0
    while kill -0 "${pid}" 2>/dev/null && [ "${count}" -lt 20 ]; do
        sleep 0.5
        count=$((count + 1))
    done
    if kill -0 "${pid}" 2>/dev/null; then kill -9 "${pid}" 2>/dev/null || true; fi
    rm -f "${PID_FILE}"
}

case "${1:-}" in
    start) start_process ;;
    stop) stop_process ;;
    status) running_pid >/dev/null && exit 0 || exit 3 ;;
    *) echo "用法：$0 {start|stop|status}"; exit 1 ;;
esac
