#!/bin/bash

LOG_FILE="${TRIM_PKGVAR}/info.log"
PID_FILE="${TRIM_PKGVAR}/app.pid"
DATA_DIR="${TRIM_PKGVAR}"
APP_DIR="${TRIM_APPDEST}"
NODE="${APP_DIR}/bin/node"
SERVER="${APP_DIR}/server.js"
PORT="${PORT:-8090}"

mkdir -p "${TRIM_PKGVAR}" 2>/dev/null

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

start_process() {
    if status; then
        return 0
    fi

    if [ ! -x "${NODE}" ] || [ ! -f "${SERVER}" ]; then
        log_msg "missing node or server.js"
        echo "应用文件不完整，请卸载后重新安装。" > "${TRIM_TEMP_LOGFILE:-$LOG_FILE}"
        return 1
    fi

    if [ ! -f "${DATA_DIR}/config.json" ] && [ -f "${APP_DIR}/config.json" ]; then
        cp "${APP_DIR}/config.json" "${DATA_DIR}/config.json"
    fi

    log_msg "Starting node ${SERVER} port=${PORT}"
    export SMS_BRIDGE_DATA="${DATA_DIR}"
    cd "${APP_DIR}" || return 1
    "${NODE}" "${SERVER}" "${PORT}" >> "${LOG_FILE}" 2>&1 &
    printf "%s" "$!" > "${PID_FILE}"
    sleep 1
    if ! status; then
        echo "启动失败，请查看应用日志。" > "${TRIM_TEMP_LOGFILE:-$LOG_FILE}"
        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:]')

        log_msg "pid=${pid}"
        if ! check_process "${pid}"; then
            rm -f "${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}" 2>/dev/null
            sleep 1
        fi
        rm -f "${PID_FILE}"
    fi

    return 0
}

check_process() {
    local pid=$1
    if [ -n "${pid}" ] && kill -0 "${pid}" 2>/dev/null; then
        return 0
    else
        return 1
    fi
}

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