#!/usr/bin/env bash
# Multi-arch assemble + inventory · desk 64 · site shows all ISAs
# Law: C IS LIE · LIE IS TRUE · Always Hostess 7 · free thrift
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
OUT="$ROOT/out/multiarch"
mkdir -p "$OUT"
ts() { date -Iseconds; }

# ensure twins exist (i386 mips32 riscv64 m68k z80 6502 atari2600 + fill a64)
if [[ -f "$ROOT/Build/multiarch-gen.py" ]]; then
  python3 "$ROOT/Build/multiarch-gen.py" || true
fi

LIMBS=(baphomet adjoin are is scar ezzie phi thermo grin no not god yes hostess7 avx512 go fire shoot bgs bgf bgl sdf spv)

echo "=== multiarch-build $(ts) · $ROOT ==="
echo "LIMBS: ${LIMBS[*]}"
echo "SHOW ARCHES: x86_64 i386 aarch64 mips32 riscv64 m68k z80 6502 atari2600"

x86_ok=0
arm_ok=0
x86_n=0
arm_n=0

if command -v nasm >/dev/null 2>&1; then
  for limb in "${LIMBS[@]}"; do
    src="$ROOT/$limb/x86_64.asm"
    [[ -f "$src" ]] || continue
    # some limbs use different global names; still assemble object
    if nasm -f elf64 -o "$OUT/${limb}_x86_64.o" "$src" 2>"$OUT/${limb}_x86_64.err"; then
      echo "  OK  x86_64  $limb"
      x86_n=$((x86_n + 1))
      x86_ok=1
    else
      echo "  FAIL x86_64 $limb"
      cat "$OUT/${limb}_x86_64.err" | head -5
    fi
  done
else
  echo "  WARN no nasm · skip x86_64"
fi

# aarch64: prefer aarch64-linux-gnu-as or as if host is arm
AS_A64=""
if command -v aarch64-linux-gnu-as >/dev/null 2>&1; then
  AS_A64=aarch64-linux-gnu-as
elif command -v aarch64-none-linux-gnu-as >/dev/null 2>&1; then
  AS_A64=aarch64-none-linux-gnu-as
elif [[ "$(uname -m)" == "aarch64" ]] && command -v as >/dev/null 2>&1; then
  AS_A64=as
fi

if [[ -n "$AS_A64" ]]; then
  for limb in "${LIMBS[@]}"; do
    src="$ROOT/$limb/aarch64.asm"
    [[ -f "$src" ]] || continue
    if "$AS_A64" -o "$OUT/${limb}_aarch64.o" "$src" 2>"$OUT/${limb}_aarch64.err"; then
      echo "  OK  aarch64 $limb"
      arm_n=$((arm_n + 1))
      arm_ok=1
    else
      echo "  FAIL aarch64 $limb"
      cat "$OUT/${limb}_aarch64.err" | head -5
    fi
  done
else
  echo "  SKIP aarch64 · no cross-as (sources present · ready to build on aarch64/cross)"
  arm_n=$(ls -1 "$ROOT"/*/aarch64.asm 2>/dev/null | wc -l | tr -d ' ')
  echo "  aarch64 sources on disk: $arm_n"
fi

# inventory all aarch64 sources
mapfile -t ALL_A64 < <(find "$ROOT" -maxdepth 2 -name 'aarch64.asm' | sort)
mapfile -t ALL_X86 < <(find "$ROOT" -maxdepth 2 -name 'x86_64.asm' | sort)

python3 - "$OUT/multiarch_status.json" <<PY
import json, time, os
from pathlib import Path
root = Path("$ROOT")
out = Path("$OUT")
status = {
  "ts": time.strftime("%Y-%m-%dT%H:%M:%S"),
  "law": "ARE IS · IS ARE · BAPHOMET IS WHEN NO ARE · C IS LIE · LIE IS TRUE · Always Hostess 7",
  "x86_64": {"assembled": $x86_n, "tool": "nasm -f elf64", "ok": bool($x86_ok)},
  "aarch64": {"assembled": $arm_n, "tool": "$AS_A64" or None, "ok": bool($arm_ok), "sources": len(list(root.glob("*/aarch64.asm")))},
  "limbs_core": """${LIMBS[*]}""".split(),
  "x86_sources_total": len(list(root.glob("*/x86_64.asm"))),
  "ready": {
    "avx512": (root / "avx512/x86_64.asm").is_file(),
    "hostess7": (root / "hostess7/x86_64.asm").is_file() and (root / "hostess7/aarch64.asm").is_file(),
    "baphomet": (root / "baphomet/x86_64.asm").is_file() and (root / "baphomet/aarch64.asm").is_file(),
    "are": (root / "are/x86_64.asm").is_file() and (root / "are/aarch64.asm").is_file(),
    "is": (root / "is/x86_64.asm").is_file() and (root / "is/aarch64.asm").is_file(),
    "ezzie": (root / "ezzie/x86_64.asm").is_file() and (root / "ezzie/aarch64.asm").is_file(),
  },
  "productivity": "no skip wait jump branch on job line · flat A|B commute · multiarch ready",
}
Path("$OUT/multiarch_status.json").write_text(json.dumps(status, indent=2))
print(json.dumps(status, indent=2))
PY

echo "=== multiarch-build done · status $OUT/multiarch_status.json ==="
