#!/bin/bash

LOG_FILE="${TRIM_PKGVAR}/info.log"
PID_FILE="${TRIM_PKGVAR}/app.pid"

export PATH=/var/apps/nodejs_v22/target/bin:$PATH

CMD="node ${TRIM_APPDEST}/server/main.js"

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

start_process() {
    if status; then
        return 0
    fi

    chmod +x "${TRIM_APPDEST}/p2pee-cli-1.0.0-linux-amd64" 2>/dev/null || true

    log_msg "Starting P2Pee server..."
    bash -c "${CMD}" >> ${LOG_FILE} 2>&1 &
    printf "%s" "$!" > ${PID_FILE}
    sleep 2
    if check_process "$(cat ${PID_FILE})"; then
        log_msg "Server started successfully (PID: $(cat ${PID_FILE}))"
        return 0
    else
        log_msg "Server failed to start"
        return 1
    fi
}

stop_process() {
    log_msg "Stopping P2Pee server..."

    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 "Process not found, cleaned pid file"
            return 0
        fi

        log_msg "Sending TERM to PID:${pid}"
        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
            log_msg "Sending KILL to PID:${pid}"
            kill -KILL "${pid}" 2>/dev/null
            sleep 1
        fi
        rm -f "${PID_FILE}"
        log_msg "Server stopped"
    fi

    return 0
}

check_process() {
    local pid=$1
    [ -n "${pid}" ] && kill -0 "${pid}" 2>/dev/null
}

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
    exit $?
    ;;
stop)
    stop_process
    exit 0
    ;;
status)
    if status; then
        exit 0
    else
        exit 3
    fi
    ;;
*)
    exit 1
    ;;
esac
