#!/usr/bin/env bash
set -euo pipefail

CLASSIC_ROOT=${W3_CLASSIC_ROOT:-/opt/war3-runtime/classic}
GAME_DIR="$CLASSIC_ROOT/war3-1285/Warcraft III"
PREFIX=${WINEPREFIX:-"$CLASSIC_ROOT/prefix"}
REPLAY=${W3_D3D9_TEST_REPLAY:-C:\\users\\ubuntu\\Documents\\Warcraft III\\Replays\\trace.w3g}
SECONDS_TO_CAPTURE=${W3_D3D9_CAPTURE_SECONDS:-45}
DISPLAY_NUMBER=${W3_D3D9_DISPLAY:-:11}
SCREEN_GEOMETRY=${W3_D3D9_SCREEN:-1024x768x24}
OUTPUT_WINDOWS=${W3_D3D9_OUTPUT_WINDOWS:-C:\\users\\ubuntu\\Temp\\w3cs.bin}
OUTPUT_UNIX="$PREFIX/drive_c/users/ubuntu/Temp/w3cs.bin"

export WINEPREFIX="$PREFIX"
export WINEARCH=win32
export WINEDEBUG=${WINEDEBUG:--all}
export PATH=/opt/wine-staging/bin:$PATH
export __GLX_VENDOR_LIBRARY_NAME=mesa
export __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
export DISPLAY="$DISPLAY_NUMBER"
export GALLIUM_DRIVER=llvmpipe
export LP_NUM_THREADS=${LP_NUM_THREADS:-3}
export LIBGL_ALWAYS_SOFTWARE=1
export WINEDLLOVERRIDES="d3d9=n,b"
export W3_D3D9_STREAM_FILE="$OUTPUT_WINDOWS"
export W3_D3D9_STREAM_CREATE=${W3_D3D9_STREAM_CREATE:-1}

wineserver -k 2>/dev/null || true
rm -f "$OUTPUT_UNIX"
cp "$(dirname "$0")/d3d9.dll" "$GAME_DIR/d3d9.dll"

Xvfb "$DISPLAY_NUMBER" -screen 0 "$SCREEN_GEOMETRY" -nolisten tcp -ac \
  +extension GLX +render -extension MIT-SHM -noreset \
  >"/tmp/w3cs-xvfb-${DISPLAY_NUMBER#:}.log" 2>&1 &
xvfb_pid=$!

cleanup() {
  pkill -f "Warcraft III.exe" 2>/dev/null || true
  wineserver -k 2>/dev/null || true
  kill "$xvfb_pid" 2>/dev/null || true
  rm -f "$GAME_DIR/d3d9.dll"
}
trap cleanup EXIT

sleep 1
pulseaudio --daemonize=yes --exit-idle-time=-1 2>/dev/null || true
pactl load-module module-null-sink sink_name=w3cs >/dev/null 2>&1 || true
pactl set-default-sink w3cs 2>/dev/null || true

(
  cd "$GAME_DIR"
  wine "Warcraft III.exe" -window -loadfile "$REPLAY"
) >"/tmp/w3cs-war3.log" 2>&1 &

for ((second = 1; second <= SECONDS_TO_CAPTURE; second++)); do
  sleep 1
  if ((second % 5 == 0)); then
    size=$(stat -c %s "$OUTPUT_UNIX" 2>/dev/null || printf '0')
    processes=$(pgrep -fc "Warcraft III.exe" || true)
    printf 't=%ss stream=%s processes=%s\n' "$second" "$size" "$processes"
  fi
done

stat -c 'capture=%n bytes=%s' "$OUTPUT_UNIX"
