#!/usr/bin/env bash
set -euo pipefail
# Run from vizcrush commit 85b22eaacb64ce5039bbe7dbe482bdbc608a45ff.
# Requires Rust 1.94.1, wasm-bindgen 0.2.115, Binaryen 129, Python 3.
out="${1:?Pass an absolute output directory}"
case "$out" in /*) ;; *) echo 'Output directory must be absolute' >&2; exit 1 ;; esac
for variant in scalar simd; do
  feature=-simd128
  if [ "$variant" = simd ]; then feature=+simd128; fi
  RUSTFLAGS="-C target-feature=$feature" CARGO_TARGET_DIR="$out/target-$variant" \
    cargo +1.94.1 build --locked --target wasm32-unknown-unknown --release \
    -p vizcrush-downsample -p vizcrush-aggregate
  for crate in downsample aggregate; do
    wasm-bindgen --target nodejs --out-dir "$out/$variant" \
      "$out/target-$variant/wasm32-unknown-unknown/release/vizcrush_$crate.wasm"
    wasm-dis "$out/$variant/vizcrush_${crate}_bg.wasm" \
      -o "$out/$variant/$crate.wat"
  done
done
# Deliberately no wasm-opt: isolate rustc's target-feature setting.

# Record the toolchain that produced these artifacts; bench.mjs copies this
# into timings.json instead of restating versions by hand.
python3 - "$out/toolchain.json" <<'PY'
import json, re, subprocess, sys
from pathlib import Path

def run(*command):
    return subprocess.run(command, check=True, capture_output=True, text=True).stdout

rustc = run('rustc', '+1.94.1', '-vV')

def rustc_field(key):
    return re.search(rf'^{key}: (.+)$', rustc, re.M)[1]

modified = run('git', 'status', '--porcelain', '--untracked-files=no')
Path(sys.argv[1]).write_text(json.dumps({
    'sourceCommit': run('git', 'rev-parse', 'HEAD').strip() + ('-dirty' if modified else ''),
    'rust': rustc_field('release'),
    'llvm': rustc_field('LLVM version'),
    'bindgen': run('wasm-bindgen', '--version').split()[-1],
    'binaryen': run('wasm-dis', '--version').split()[-1],
}, indent=2) + '\n')
PY
echo "Recorded toolchain: $out/toolchain.json"
