#!/usr/bin/env bash
# Desktop/x/RTXLayer · AMOURANTHRTX Game System · Computer SPV execution
# X11 IN · transparency -1 CLEAR default · SORT top · no Vulkan · no restart
set -euo pipefail
_SELF="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || echo "$0")"
HERE="$(cd "$(dirname "$_SELF")" && pwd)"
ROOT="$(cd "$HERE/.." && pwd)"
OUT="${RTX_OUT:-$HERE/out}"
BUILD_BIN="$HERE/bin"
mkdir -p "$OUT" "$BUILD_BIN"
export DISPLAY="${DISPLAY:-:0}"
export __GLX_VENDOR_LIBRARY_NAME="${__GLX_VENDOR_LIBRARY_NAME:-nvidia}"

die() { echo "RTXLayer: $*" >&2; exit 1; }

cmd_spv() {
  command -v glslangValidator >/dev/null || die "glslangValidator missing"
  glslangValidator -V -S comp -o "$HERE/rtx.spv" "$HERE/rtx.comp"
  # mirror for Build/ friends
  cp -f "$HERE/rtx.spv" "$ROOT/Build/rtx.spv" 2>/dev/null || true
  echo "SPV $HERE/rtx.spv"
  ls -la "$HERE/rtx.spv"
}

cmd_build_glx() {
  gcc -O2 -o "$BUILD_BIN/rtx_glx" "$HERE/rtx_glx.c" -lGL -lGLX -lX11
  echo "bin/rtx_glx"
}

cmd_build_pass() {
  gcc -O2 -o "$BUILD_BIN/rtx_pass" "$HERE/rtx_pass.c" -lGL -lGLX -lX11 -lXext -lXrender -lm
  echo "bin/rtx_pass"
}

cmd_build() {
  cmd_spv
  cmd_build_glx
  cmd_build_pass
  echo "RTXLayer build OK"
}

cmd_plate() {
  cmd_spv
  cmd_build_glx
  "$BUILD_BIN/rtx_glx" \
    --comp "$HERE/rtx.comp" \
    --w "${RTX_W:-512}" --h "${RTX_H:-512}" --seed "${RTX_SEED:-7}" \
    --out "$OUT/amouranth_rtx_compute.ppm"
  echo "plate $OUT/amouranth_rtx_compute.ppm"
}

cmd_pass() {
  cmd_spv
  cmd_build_pass
  local t="${RTX_ALPHA:--1}"
  echo "RTXLayer pass · transparency $t · SORT top · Ctrl+Shift+Q"
  "$BUILD_BIN/rtx_pass" \
    --w "${RTX_W:-512}" --h "${RTX_H:-512}" \
    --seed "${RTX_SEED:-7}" \
    --transparency "$t" \
    ${RTX_SECONDS:+--seconds "$RTX_SECONDS"} \
    ${RTX_FADE_SEC:+--fade-sec "$RTX_FADE_SEC"} \
    "$@"
}

cmd_demo() {
  RTX_SECONDS="${RTX_SECONDS:-14}" cmd_pass --demo --fade-sec "${RTX_FADE_SEC:-2}" "$@"
}

cmd_status() {
  echo "RTXLayer · AMOURANTHRTX Game System · Computer SPV"
  echo "here:  $HERE"
  echo "out:   $OUT"
  echo "X11:   DISPLAY=$DISPLAY"
  echo "transparency default: -1 CLEAR passthrough"
  [[ -f "$HERE/rtx.comp" ]] && echo "comp:  OK" || echo "comp:  MISS"
  [[ -f "$HERE/rtx.spv" ]] && echo "spv:   OK $(ls -la "$HERE/rtx.spv" | awk '{print $5}')" || echo "spv:   (run: rtx spv)"
  [[ -x "$BUILD_BIN/rtx_pass" ]] && echo "pass:  built" || echo "pass:  not built"
  [[ -x "$BUILD_BIN/rtx_glx" ]] && echo "glx:   built" || echo "glx:   not built"
  command -v glslangValidator >/dev/null && echo "glslang: OK" || echo "glslang: MISS"
  echo "SORT:  $HERE/SORT.txt"
  cat "$HERE/SORT.txt"
}

cmd_dc_spv() {
  command -v glslangValidator >/dev/null || die "glslangValidator missing"
  local comp="$HERE/datacenter/shaders/raymarch.comp"
  local out="$HERE/datacenter/spv/raymarch.spv"
  mkdir -p "$(dirname "$out")"
  glslangValidator -V -S comp -o "$out" "$comp"
  cp -f "$out" "$OUT/raymarch.spv" 2>/dev/null || true
  echo "SPV raymarch $out"
  ls -la "$out"
}

cmd_dc() {
  local port="${DC_PORT:-8766}"
  local dir="$HERE/datacenter"
  local sub="${1:-start}"
  [[ -f "$dir/index.html" ]] || die "datacenter missing"
  case "$sub" in
    start|on|up)
      cmd_dc_spv || true
      if systemctl cat bgrtx-datacenter.service >/dev/null 2>&1; then
        systemctl --user 2>/dev/null true
        # system unit (installed with sudo)
        if systemctl is-enabled bgrtx-datacenter.service >/dev/null 2>&1 \
          || systemctl status bgrtx-datacenter.service >/dev/null 2>&1 \
          || [[ -f /etc/systemd/system/bgrtx-datacenter.service ]]; then
          echo "Datacenter · real unit bgrtx-datacenter.service"
          systemctl start bgrtx-datacenter.service 2>/dev/null \
            || sudo systemctl start bgrtx-datacenter.service
          systemctl --no-pager --full status bgrtx-datacenter.service 2>/dev/null | head -16 \
            || sudo systemctl --no-pager --full status bgrtx-datacenter.service | head -16
          echo "http://127.0.0.1:${port}/"
          return 0
        fi
      fi
      die "unit not installed · run: sudo $HERE/bin/install-datacenter-unit.sh"
      ;;
    stop|off|down)
      systemctl stop bgrtx-datacenter.service 2>/dev/null \
        || sudo systemctl stop bgrtx-datacenter.service
      echo "Datacenter stopped"
      ;;
    restart)
      systemctl restart bgrtx-datacenter.service 2>/dev/null \
        || sudo systemctl restart bgrtx-datacenter.service
      echo "Datacenter restarted · http://127.0.0.1:${port}/"
      ;;
    status|st)
      systemctl --no-pager --full status bgrtx-datacenter.service 2>/dev/null \
        || sudo systemctl --no-pager --full status bgrtx-datacenter.service
      curl -sS -o /dev/null -w "HTTP %{http_code}\n" "http://127.0.0.1:${port}/" 2>/dev/null || echo "HTTP down"
      ;;
    fg|foreground)
      # rare: run without unit (will be reaped if orphan timer hits unless BGRTX_KEEP)
      export BGRTX_DATACENTER=1 BGRTX_KEEP=1
      exec "$HERE/bin/bgrtx-datacenter-serve"
      ;;
    *)
      die "dc sub: start|stop|restart|status|fg"
      ;;
  esac
}

cmd_help() {
  cat <<EOF
Desktop/x/RTXLayer · Game System · Computer SPV execution

  ./RTXLayer/rtx status
  ./RTXLayer/rtx spv              shell rtx.comp → rtx.spv
  ./RTXLayer/rtx dc-spv           raymarch.comp → datacenter/spv/raymarch.spv
  ./RTXLayer/rtx dc [start|stop|restart|status]
                                  real systemd unit bgrtx-datacenter
                                  http://127.0.0.1:8766/  (orphan-kill safe)
  ./RTXLayer/rtx build            spv + glx + pass binaries
  ./RTXLayer/rtx plate            one-shot compute → out/*.ppm
  ./RTXLayer/rtx pass             fullscreen · transparency -1 CLEAR
  ./RTXLayer/rtx pass -t 0.5      shells visible
  ./RTXLayer/rtx pass --fade black|white
  ./RTXLayer/rtx demo             free BLACK/WHITE fade show
  ./RTXLayer/rtx engine           NATIVE HTML/CSS/SPV · no browser · X11 GL
  ./RTXLayer/rtx engine-spv       engine shaders → engine/spv/raymarch.spv
  ./RTXLayer/rtx engine-status    STATUS.txt
  ./RTXLayer/rtx wb …             webbrowser SPV hotswap JS/DOM (wb CLI)
  ./RTXLayer/rtx sort             print SORT

  env: RTX_ALPHA=-1  RTX_W=512  RTX_H=512  RTX_SEED=7
  quit pass: Ctrl+Shift+Q · engine: Esc/q
  .com stays WordPress.com Atomic · no desk 127 required
EOF
}

cmd_engine_spv() {
  command -v glslangValidator >/dev/null || die "glslangValidator missing"
  mkdir -p "$HERE/engine/spv"
  glslangValidator -V -S comp \
    -o "$HERE/engine/spv/raymarch.spv" \
    "$HERE/engine/shaders/raymarch_gl.comp"
  echo "ENGINE SPV $HERE/engine/spv/raymarch.spv"
  ls -la "$HERE/engine/spv/raymarch.spv"
}

cmd_engine_build() {
  mkdir -p "$HERE/engine/bin"
  gcc -O2 -D_GNU_SOURCE -o "$HERE/engine/bin/engine" "$HERE/engine/engine.c" \
    -lGL -lGLX -lX11 -lXext -lm
  echo "ENGINE $HERE/engine/bin/engine"
  cmd_engine_spv || true
}

cmd_engine() {
  cmd_engine_build
  echo "native engine · HTML+CSS parsed by us · SPV compute every frame · no browser"
  DISPLAY="${DISPLAY:-:0}" __GLX_VENDOR_LIBRARY_NAME=nvidia \
    exec "$HERE/engine/bin/engine" --root "$HERE/engine"
}

cmd_engine_status() {
  cat "$HERE/engine/STATUS.txt"
  echo "---"
  [[ -x "$HERE/engine/bin/engine" ]] && echo "binary: OK" || echo "binary: MISS"
  [[ -f "$HERE/engine/spv/raymarch.spv" ]] && echo "spv:    OK $(stat -c%s "$HERE/engine/spv/raymarch.spv") bytes" || echo "spv: MISS"
  echo "GL path: X11 + GLX + OpenGL compute (you saw GL)"
  echo "browser unit: bgrtx-datacenter.service (optional) · separate"
}

c="${1:-status}"
shift || true
case "$c" in
  help|-h|--help) cmd_help ;;
  status|st) cmd_status ;;
  sort|SORT) cat "$HERE/SORT.txt" ;;
  spv) cmd_spv ;;
  dc-spv|raymarch-spv) cmd_dc_spv ;;
  dc|datacenter|app) cmd_dc "$@" ;;
  engine) cmd_engine "$@" ;;
  engine-spv) cmd_engine_spv ;;
  engine-build) cmd_engine_build ;;
  engine-status|estatus) cmd_engine_status ;;
  wb|webbrowser) exec "$HERE/webbrowser/wb" "$@" ;;
  build) cmd_build ;;
  plate|compute) cmd_plate ;;
  pass|passthrough|overlay) cmd_pass "$@" ;;
  demo|show) cmd_demo "$@" ;;
  *) die "unknown: $c · try: rtx help" ;;
esac
