#!/usr/bin/env bash
# Hostowy launcher LoreSpeak dla Steam/Proton i Flatpaka.
# Instalowany jako ~/.local/bin/lorespeak, aby używał tej samej komendy co pakiet natywny.
set -euo pipefail

APP_ID="pl.lorespeak.LoreSpeak"
FLATPAK_BIN="/usr/bin/flatpak"
VOICE_PACK=""
LOG_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/lorespeak"
LOG_FILE="$LOG_DIR/steam-wrapper.log"
HOST_DATA_HOME="$HOME/.local/share"

mkdir -p "$LOG_DIR"
exec >>"$LOG_FILE" 2>&1

echo "[$(date --iso-8601=seconds)] launcher start: $0 $*"
echo "[$(date --iso-8601=seconds)] HOME=$HOME XDG_DATA_HOME=${XDG_DATA_HOME:-<unset>}"

while [[ $# -gt 0 ]]; do
    case "$1" in
        --voice-pack)
            VOICE_PACK="${2:?Brak wartości --voice-pack}"
            shift 2
            ;;
        --wrapper|--)
            shift
            break
            ;;
        *)
            echo "Użycie: lorespeak --voice-pack <pakiet.lsvp> --wrapper <komenda gry>" >&2
            exit 2
            ;;
    esac
done

if [[ -z "$VOICE_PACK" || $# -eq 0 ]]; then
    echo "Użycie: lorespeak --voice-pack <pakiet.lsvp> --wrapper <komenda gry>" >&2
    exit 2
fi

send_ipc() {
    local message="$1"
    local response

    if ! exec 3<>/dev/tcp/127.0.0.1/14201 2>/dev/null; then
        return 1
    fi
    printf '%s\n' "$message" >&3
    if ! IFS= read -r -t 2 response <&3; then
        exec 3>&-
        exec 3<&-
        return 1
    fi
    exec 3>&-
    exec 3<&-
    [[ "$response" == "OK" ]]
}

run_flatpak() {
    env -i \
        HOME="$HOME" \
        USER="${USER:-$(id -un)}" \
        LOGNAME="${LOGNAME:-${USER:-$(id -un)}}" \
        PATH="/usr/bin:/bin" \
        XDG_DATA_HOME="$HOST_DATA_HOME" \
        XDG_DATA_DIRS="/usr/local/share:/usr/share" \
        XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:?Brak XDG_RUNTIME_DIR}" \
        DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-}" \
        DISPLAY="${DISPLAY:-}" \
        WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-}" \
        XAUTHORITY="${XAUTHORITY:-}" \
        "$FLATPAK_BIN" "$@"
}

# Daemon działa w sandboxie i udostępnia TCP IPC na loopbacku. Nie uruchamiamy
# gry przez flatpak-spawn --host: pozostaje ona dzieckiem Steam/pressure-vessel.
if ! send_ipc "PING"; then
    if [[ ! -x "$FLATPAK_BIN" ]]; then
        echo "Nie znaleziono hostowego polecenia Flatpak: $FLATPAK_BIN."
        exit 1
    fi
    if ! run_flatpak info --user "$APP_ID"; then
        echo "Nie znaleziono Flatpaka $APP_ID."
        exit 1
    fi
    echo "[$(date --iso-8601=seconds)] daemon not running; starting Flatpak daemon with $FLATPAK_BIN"
    run_flatpak run --user "$APP_ID" --daemon &
fi

until send_ipc "START:$VOICE_PACK"; do
    if (( SECONDS >= 15 )); then
        echo "[$(date --iso-8601=seconds)] LoreSpeak daemon nie potwierdził gotowości w ciągu 15 sekund."
        exit 1
    fi
    sleep 0.2
done

cleanup() {
    echo "[$(date --iso-8601=seconds)] launcher cleanup"
    send_ipc "STOP" || true
}
trap cleanup EXIT

echo "[$(date --iso-8601=seconds)] starting game: $*"
set +e
"$@"
status=$?
set -e

echo "[$(date --iso-8601=seconds)] game exited with status $status"
exit "$status"
