#!/bin/bash

BIN_FILE="${TRIM_APPDEST}/server/bin/automount-server"
PID_FILE="${TRIM_PKGVAR}/automount.pid"
SOCKET_FILE="${TRIM_APPDEST}/app.sock"
LOG_FILE="${TRIM_PKGVAR}/automount-service.log"

write_error() {
    local message="$1"
    if [ -n "${TRIM_TEMP_LOGFILE:-}" ]; then
        printf '%s\n' "$message" > "$TRIM_TEMP_LOGFILE"
    fi
    printf '%s\n' "$message" >> "$LOG_FILE"
}

read_pid() {
    if [ -r "$PID_FILE" ]; then
        head -n 1 "$PID_FILE" | tr -cd '0-9'
    fi
}

is_running() {
    local pid
    pid="$(read_pid)"
    if [ -z "$pid" ] || ! kill -0 "$pid" 2>/dev/null; then
        return 1
    fi

    local process_exe
    process_exe="$(readlink -f "/proc/${pid}/exe" 2>/dev/null || true)"
    [ "$process_exe" = "$(readlink -f "$BIN_FILE" 2>/dev/null)" ]
}

check_requirements() {
    if [ "$(id -u)" != "0" ]; then
        write_error "外置存储挂载服务需要 root 权限。"
        return 1
    fi
    if [ ! -x "$BIN_FILE" ]; then
        write_error "应用服务文件不存在或不可执行。"
        return 1
    fi
    local command_name
    for command_name in lsblk findmnt mount umount; do
        if ! command -v "$command_name" >/dev/null 2>&1; then
            write_error "系统缺少必要命令：${command_name}"
            return 1
        fi
    done
}

start_app() {
    if is_running; then
        return 0
    fi
    check_requirements || return 1

    mkdir -p "$TRIM_PKGETC" "$TRIM_PKGVAR"
    rm -f "$PID_FILE" "$SOCKET_FILE"
    printf '%s - Starting AutoMount %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$TRIM_APPVER" >> "$LOG_FILE"

    AUTOMOUNT_SOCKET="$SOCKET_FILE" nohup "$BIN_FILE" >> "$LOG_FILE" 2>&1 &
    local pid="$!"
    printf '%s' "$pid" > "$PID_FILE"

    local count=0
    while [ "$count" -lt 50 ]; do
        if ! kill -0 "$pid" 2>/dev/null; then
            rm -f "$PID_FILE" "$SOCKET_FILE"
            write_error "外置存储挂载服务启动失败，请查看应用日志。"
            return 1
        fi
        if [ -S "$SOCKET_FILE" ]; then
            return 0
        fi
        sleep 0.1
        count=$((count + 1))
    done

    kill -TERM "$pid" 2>/dev/null || true
    rm -f "$PID_FILE" "$SOCKET_FILE"
    write_error "外置存储挂载服务启动超时。"
    return 1
}

stop_app() {
    local pid
    pid="$(read_pid)"
    if ! is_running; then
        rm -f "$PID_FILE" "$SOCKET_FILE"
        return 0
    fi

    kill -TERM "$pid" 2>/dev/null || true
    local count=0
    while kill -0 "$pid" 2>/dev/null && [ "$count" -lt 50 ]; do
        sleep 0.1
        count=$((count + 1))
    done
    if kill -0 "$pid" 2>/dev/null; then
        kill -KILL "$pid" 2>/dev/null || true
    fi
    rm -f "$PID_FILE" "$SOCKET_FILE"
}

case "${1:-}" in
start)
    start_app
    ;;
stop)
    stop_app
    ;;
status)
    if is_running && [ -S "$SOCKET_FILE" ]; then
        exit 0
    fi
    exit 3
    ;;
*)
    write_error "不支持的应用控制命令。"
    exit 1
    ;;
esac
