#!/bin/bash
set -uo pipefail

INSTALL_ROOT="$HOME/Library/Application Support/CryoHost/CryoRadio Receiver"
RECEIVER="$INSTALL_ROOT/CryoRadio.Receiver"
LOG_DIR="$HOME/Library/Application Support/CryoHost/CryoRadio/logs"
SESSION_LOG="$LOG_DIR/session-wrapper.log"

mkdir -p "$LOG_DIR"

printf '%s\n' \
    "wrapper_invoked=$(date -u '+%Y-%m-%dT%H:%M:%SZ')" \
    "wrapper_argc=$#" \
    "wrapper_argv=$*" \
    >>"$SESSION_LOG"

if [[ ! -x "$RECEIVER" ]]; then
    printf '%s\n' "CryoRadio Receiver is not installed correctly: $RECEIVER" >&2
    exit 70
fi

if [[ "$#" -eq 0 ]]; then
    printf '%s\n' "CryoRadio session wrapper received no Project Zomboid command." >&2
    exit 64
fi

GAME_TARGET="$1"
shift

"$RECEIVER" --worker >>"$SESSION_LOG" 2>&1 &
receiver_pid=$!

cleanup_receiver() {
    if kill -0 "$receiver_pid" 2>/dev/null; then
        kill -TERM "$receiver_pid" 2>/dev/null || true

        for _ in {1..30}; do
            if ! kill -0 "$receiver_pid" 2>/dev/null; then
                break
            fi
            sleep 0.1
        done

        if kill -0 "$receiver_pid" 2>/dev/null; then
            kill -KILL "$receiver_pid" 2>/dev/null || true
        fi
    fi

    wait "$receiver_pid" 2>/dev/null || true
}

trap cleanup_receiver EXIT INT TERM HUP

if [[ "$GAME_TARGET" == *.app && -d "$GAME_TARGET" ]]; then
    printf '%s\n' "wrapper_launch_mode=macos-app-bundle-open-wait" >>"$SESSION_LOG"

    if [[ "$#" -gt 0 ]]; then
        /usr/bin/open -W "$GAME_TARGET" --args "$@"
    else
        /usr/bin/open -W "$GAME_TARGET"
    fi

    game_status=$?
else
    printf '%s\n' "wrapper_launch_mode=direct-command" >>"$SESSION_LOG"
    "$GAME_TARGET" "$@"
    game_status=$?
fi

cleanup_receiver
trap - EXIT INT TERM HUP

exit "$game_status"
