#!/bin/sh
#
# shutdown wrapper for BusyBox-based systems
# Supports: +minutes, hh:mm, now, cancel, -h, -r
# Adds: broadcast with wall, logging with logger, job tracking for cancel

PID_FILE="/var/run/shutdown.pid"
WHOAMI=$(whoami)

# --- Helper Functions ---
log_msg() {
    MSG="$1"
    echo "$MSG"
    command -v logger >/dev/null 2>&1 && logger -t shutdown-wrapper "$MSG"
}

broadcast_msg() {
    MSG="$1"
    if command -v wall >/dev/null 2>&1; then
        echo "$MSG" | wall
    else
        echo "wall not available; skipping user broadcast."
    fi
}

usage() {
    echo "Usage: shutdown [-h | -r | -c] [TIME: now | +m | hh:mm] [MESSAGE]"
    exit 1
}

ACTION="poweroff"
TIME="now"
MESSAGE=""
CANCEL=0

# --- Argument Parsing ---
while [ "$1" ]; do
    case "$1" in
        -h)
            ACTION="poweroff"
            shift
            ;;
        -r)
            ACTION="reboot"
            shift
            ;;
        -c)
            CANCEL=1
            shift
            ;;
        now)
            TIME="now"
            shift
            ;;
        +*)
            TIME="$1"
            shift
            ;;
        [0-9][0-9]:[0-9][0-9])
            TIME="$1"
            shift
            ;;
        *)
            MESSAGE="$@"
            break
            ;;
    esac
done

# --- Cancel Shutdown ---
if [ "$CANCEL" -eq 1 ]; then
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if kill "$PID" 2>/dev/null; then
            log_msg "Cancelled scheduled shutdown (PID $PID)."
            broadcast_msg "$WHOAMI has canceled the scheduled shutdown."
            rm -f "$PID_FILE"
            exit 0
        else
            log_msg "No active shutdown process to cancel (stale PID?)."
            rm -f "$PID_FILE"
            exit 1
        fi
    else
        log_msg "No shutdown is currently scheduled."
        exit 1
    fi
fi

# --- Perform Shutdown ---
do_shutdown() {
    MSG="System is going down for $ACTION now!"
    log_msg "$MSG"
    broadcast_msg "$MSG"
    exec $ACTION
}

# --- Schedule Shutdown ---
DELAY_MIN=0

if echo "$TIME" | grep -q '+'; then
	DELAY_MIN=$(echo "$TIME" | sed 's/+//')
elif echo "$TIME" | grep -qE '^[0-9][0-9]:[0-9][0-9]$'; then
	TARGET_HOUR=$(echo "$TIME" | cut -d: -f1)
	TARGET_MIN=$(echo "$TIME" | cut -d: -f2)
	NOW_HOUR=$(date +%H)
	NOW_MIN=$(date +%M)

	NOW_TOTAL=$((10#$NOW_HOUR * 60 + 10#$NOW_MIN))
	TARGET_TOTAL=$((10#$TARGET_HOUR * 60 + 10#$TARGET_MIN))

	DELAY_MIN=$((TARGET_TOTAL - NOW_TOTAL))
	[ "$DELAY_MIN" -lt 0 ] && DELAY_MIN=$((DELAY_MIN + 1440))
elif [ "$TIME" = "now" ]; then
	do_shutdown
else
	usage
fi

log_msg "Scheduling $ACTION in $DELAY_MIN minute(s)."
broadcast_msg "$WHOAMI scheduled system $ACTION in $DELAY_MIN minutes. $MESSAGE"

(
	sleep "$((DELAY_MIN * 60))"
	log_msg "Executing delayed $ACTION now."
	broadcast_msg "System is going down for $ACTION now!"
	$ACTION
) &

echo $! > "$PID_FILE"
log_msg "Shutdown background process PID $! saved for tracking."
