#!/usr/bin/env bash
set -euo pipefail
LOGFILE="$HOME/.local/logs/steam.log"
export PATH="$HOME/.local/bin:$PATH"

export SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0

# There is no way to set a color space for an NV12
# buffer in Wayland. And the color management protocol that is
# meant to let this happen is missing the color range...
# So just workaround this with an ENV var that Remote Play Together
# and Gamescope will use for now.
export GAMESCOPE_NV12_COLORSPACE=k_EStreamColorspace_BT601
export STEAM_GAMESCOPE_HDR_SUPPORTED=1

# Workaround older versions of vkd3d-proton setting this
# too low (desc.BufferCount), resulting in symptoms that are potentially like
# swapchain starvation.
export VKD3D_SWAPCHAIN_LATENCY_FRAMES=3

# Let's try this across the board to see if it breaks anything
# Helps performance in HZD, Cyberpunk, at least
# Expose 8 physical cores, instead of 4c/8t
# export WINE_CPU_TOPOLOGY=8:0,1,2,3,4,5,6,7

# To expose vram info from radv's patch we're including
export WINEDLLOVERRIDES=dxgi=n

# Disable automatic audio device switching in steam, now handled by wireplumber
export STEAM_DISABLE_AUDIO_DEVICE_SWITCHING=1

# Enable support for xwayland isolation per-game in Steam
# export STEAM_MULTIPLE_XWAYLANDS=0

# We have NIS support
export STEAM_GAMESCOPE_NIS_SUPPORTED=1

# Enable tearing controls in steam
export STEAM_GAMESCOPE_TEARING_SUPPORTED=1

# Enable VRR controls in steam
export STEAM_GAMESCOPE_VRR_SUPPORTED=1

# When set to 1, a toggle will show up in the steamui to control whether dynamic refresh rate is applied to the steamui
export STEAM_GAMESCOPE_DYNAMIC_REFRESH_IN_STEAM_SUPPORTED=0

# Don't wait for buffers to idle on the client side before sending them to gamescope
export vk_xwayland_wait_ready=false

# Scaling support
export STEAM_GAMESCOPE_FANCY_SCALING_SUPPORT=1

# Color management support
export STEAM_GAMESCOPE_COLOR_MANAGED=1
export STEAM_GAMESCOPE_VIRTUAL_WHITE=1

# Temporary crutch until dummy plane interactions / etc are figured out
# export GAMESCOPE_DISABLE_ASYNC_FLIPS=1

# Use Vulkan for the Steam Overlay
export STEAM_OVERLAY_RENDERER=vk

# Set input method modules for Qt/GTK that will show the Steam keyboard
export QT_IM_MODULE=steam
export GTK_IM_MODULE=Steam

export XCURSOR_THEME=steam
export XCURSOR_SCALE=256

export GAMESCOPE_WSI=0
export STEAM_USE_PW_CAPTURE=0               # Deck prefers gamescope capture path
export STEAM_DISABLE_GAMESCOPE_LAUNCH=0     # allow gamescope handling

log() { echo "[$(date --iso-8601=seconds)] $*" | tee -a "$LOGFILE"; }

mkdir -p $XDG_RUNTIME_DIR
chmod 700 $XDG_RUNTIME_DIR

if [ -r /proc/sys/user/max_user_namespaces ]; then
  max_ns="$(cat /proc/sys/user/max_user_namespaces || echo 0)"
  if [ "${max_ns:-0}" -eq 0 ]; then
    log "ERROR: user.max_user_namespaces is 0. Enable it with: sudo sysctl -w user.max_user_namespaces=15000"
    exit 1
  fi
fi

if command -v bwrap >/dev/null 2>&1; then
  bwrap_bin="$(command -v bwrap)"
  if ! [ -u "$bwrap_bin" ]; then
    # Not fatal if user namespaces are enabled, but warn for visibility
    log "WARN: $bwrap_bin is not setuid root. If Steam still fails, run: sudo dnf reinstall bubblewrap && sudo chmod 4755 /usr/bin/bwrap"
  fi
else
  log "WARN: bubblewrap (bwrap) not found. Steam may fail to start."
fi

if findmnt -no OPTIONS / | grep -qw nosuid; then
  log "WARN: root filesystem is mounted nosuid. Setuid helpers like bubblewrap will not work."
fi

STEAM_BIN="$(command -v steam || true)"
if [ -z "$STEAM_BIN" ]; then
  log "ERROR: steam not found in PATH"
  exit 127
fi

log "Updating steam: /opt/steamcmd/steamcmd.sh +quit"
/opt/steamcmd/steamcmd.sh +quit >>"$LOGFILE" 2>&1 || {
  log "ERROR: Steam update failed"
  exit 1
}

log "Launching Steam"
STEAM_ARGS=("-steamdeck" "-steamos3" "-gamepadui")
systemd-run --user --scope --quiet \
  --unit=steam.scope \
  --slice=steam.slice \
  "$STEAM_BIN" "${STEAM_ARGS[@]}" >>"$LOGFILE" 2>&1 &
steam_scope_pid=$!
log "Steam started with pid $steam_scope_pid"

{
  SUNSHINE_BIN="$(command -v sunshine || true)"
  if [ -z "$SUNSHINE_BIN" ]; then
    log "ERROR: sunshine not found in PATH"
  else
    SUNSHINE_LOG_FILE="$HOME/.local/logs/sunshine.log"
    log "Found Sunshine: $SUNSHINE_BIN, starting after 5s delay"
    sleep 5
    systemd-run --user --scope --quiet \
    --unit=sunshine.scope \
    --slice=sunshine.slice \
    "$SUNSHINE_BIN" "$HOME/.config/sunshine/sunshine.conf"
  fi
} &

# Wait for Steam to exit
wait "$steam_scope_pid"
status=$?

# Stop Sunshine gracefully
if systemctl --user is-active --quiet sunshine.scope; then
  log "Stopping Sunshine"
  systemctl --user stop sunshine.scope
fi

log "Steam session ended."
exit "$status"
