#!/bin/bash

DATA_DIR="${TRIM_PKGVAR}"
SOCKET="${TRIM_APPDEST}/app.sock"
LOG_FILE="${DATA_DIR}/info.log"
PID_FILE="${DATA_DIR}/app.pid"

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

fail_msg() {
    log_msg "$1"
    [ -n "${TRIM_TEMP_LOGFILE}" ] && echo "$1" > "${TRIM_TEMP_LOGFILE}"
}

pick_bin() {
    echo "${TRIM_APPDEST}/bin/lanmesh"
}

check_process() {
    kill -0 "$1" 2>/dev/null
}

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

start_process() {
    if status; then
        return 0
    fi
    mkdir -p "${DATA_DIR}"
    bin=$(pick_bin)
    if [ ! -x "${bin}" ]; then
        fail_msg "找不到程序 ${bin}"
        return 1
    fi
    modprobe wireguard 2>/dev/null || true
    rm -f "${SOCKET}"
    log_msg "Starting X-异地组网 desktop window ..."
    nohup "${bin}" fnos --data "${DATA_DIR}" --socket "${SOCKET}" >> "${LOG_FILE}" 2>&1 &
    printf "%s" "$!" > "${PID_FILE}"

    count=0
    while [ $count -lt 15 ]; do
        sleep 1
        if ! status; then
            fail_msg "X-异地组网 启动失败，请查看日志 ${LOG_FILE}"
            return 1
        fi
        if [ -S "${SOCKET}" ]; then
            log_msg "Started, pid=$(cat "${PID_FILE}")"
            return 0
        fi
        count=$((count + 1))
    done
    log_msg "Socket not ready after 15s, but process is running"
    return 0
}

stop_process() {
    if [ -r "${PID_FILE}" ]; then
        pid=$(head -n 1 "${PID_FILE}" | tr -d '[:space:]')
        if [ -n "${pid}" ] && check_process "${pid}"; then
            log_msg "Stopping pid ${pid} ..."
            kill -TERM "${pid}" 2>/dev/null
            count=0
            while check_process "${pid}" && [ $count -lt 10 ]; do
                sleep 1
                count=$((count + 1))
            done
            check_process "${pid}" && kill -KILL "${pid}" 2>/dev/null
        fi
        rm -f "${PID_FILE}"
    fi
    rm -f "${SOCKET}"
    ip link delete lanmesh0 2>/dev/null || true
    return 0
}

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