#!/bin/bash

LOG_FILE="${TRIM_PKGVAR}/info.log"
PID_FILE="${TRIM_PKGVAR}/app.pid"
BIN="${TRIM_APPDEST}/global-radio-server"

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

# 按 /proc/<pid>/comm 检测真实进程，避免重启后 pid 被无关进程复用导致误判
check_process() {
    local pid=$1
    [ -n "$pid" ] || return 1
    if kill -0 "$pid" 2>/dev/null && grep -q "global-radio-s" "/proc/${pid}/comm" 2>/dev/null; then
        return 0
    fi
    return 1
}

start_process() {
    if status; then
        log_msg "already running"
        return 0
    fi

    PORT=8775
    if [ -r "${TRIM_PKGETC}/config.conf" ]; then
        . "${TRIM_PKGETC}/config.conf"
        [ -n "${web_port}" ] && PORT="${web_port}"
    fi

    if [ ! -x "${BIN}" ]; then
        log_msg "ERROR: ${BIN} not found"
        [ -n "${TRIM_TEMP_LOGFILE}" ] && echo "启动失败：找不到 ${BIN}" >> "${TRIM_TEMP_LOGFILE}"
        return 1
    fi

    log_msg "Starting global-radio on port ${PORT} ..."
    cd "${TRIM_APPDEST}"
    PORT="${PORT}" WEB_ROOT="${TRIM_APPDEST}/www" "${BIN}" >> ${LOG_FILE} 2>&1 &
    printf "%s" "$!" > ${PID_FILE}
    sleep 1
    if ! check_process "$(cat ${PID_FILE})"; then
        log_msg "ERROR: process exited immediately"
        [ -n "${TRIM_TEMP_LOGFILE}" ] && echo "global-radio 启动失败，请查看 ${LOG_FILE}" >> "${TRIM_TEMP_LOGFILE}"
        return 1
    fi
    return 0
}

stop_process() {
    log_msg "Stopping process ..."

    if [ -r "${PID_FILE}" ]; then
        pid=$(head -n 1 "${PID_FILE}" | tr -d '[:space:]')
        if ! check_process "${pid}"; then
            rm -f "${PID_FILE}"
            log_msg "remove stale pid file"
            return 0
        fi

        kill -TERM ${pid} >> ${LOG_FILE} 2>&1
        local count=0
        while check_process "${pid}" && [ $count -lt 10 ]; do
            sleep 1
            count=$((count + 1))
        done

        if check_process "${pid}"; then
            kill -KILL ${pid} >> ${LOG_FILE} 2>&1
            sleep 1
        fi
        rm -f "${PID_FILE}"
        log_msg "process stopped"
    fi
    return 0
}

status() {
    if [ -f "${PID_FILE}" ]; then
        pid=$(head -n 1 "${PID_FILE}" | tr -d '[:space:]')
        if check_process "${pid}"; then
            return 0
        fi
        rm -f "${PID_FILE}"
    fi
    return 1
}

case $1 in
start)
    start_process
    ;;
stop)
    stop_process
    ;;
status)
    if status; then
        exit 0
    else
        exit 3
    fi
    ;;
*)
    exit 1
    ;;
esac
