#!/bin/sh
set -eu
MEUM=1.1975807343385265
FI=134964356
usage(){ cat <<'TXT'
smeum-media — sCode raw/Meum media utility
usage:
  smeum-media pack RAW_FILE STORE
  smeum-media unpack MANIFEST OUT
  smeum-media probe FILE|MANIFEST
  smeum-media play FILE|MANIFEST

Native accepted media:
  .wav                 PCM WAV (uncompressed)
  .pcm .raw .sraw      raw PCM; optional FILE.meta: rate=48000 channels=2 format=s16le
  .ppm                 raw PPM frame
  .mid .midi           MIDI stream
  .mseq                raw frame sequence: each non-comment line is PATH<TAB>MILLISECONDS
  *.mpk                 MeumPack manifest (segment/dedup representation)
Compressed consumer codecs are intentionally outside the native sCode media ABI.
TXT
}
sha(){ sha256sum "$1" | awk '{print $1}'; }
route(){ printf '%s' "$1" | sha256sum | awk -v I="$FI" '{h=substr($1,1,12); n=strtonum("0x" h); printf "%u", n % I}' 2>/dev/null || printf '%s' "$1" | cksum | awk -v I="$FI" '{print $1 % I}'; }
pack(){
 src=$1; store=$2; mkdir -p "$store/chunks" "$store/manifests"
 base=$(basename "$src"); full=$(sha "$src"); key=$(route "$full:$base"); mf="$store/manifests/$key.mpk"
 printf 'MEUMPACK2\nfile=%s\nsha256=%s\nfi=%s\nmeum=%s\nsegment_size=65536\nexpansion_key=%s\n' "$base" "$full" "$FI" "$MEUM" "$key" > "$mf"
 size=$(wc -c < "$src" | tr -d ' '); count=$(( (size + 65535) / 65536 )); i=0; tmp=${TMPDIR:-/tmp}/smeum.$$
 while [ "$i" -lt "$count" ]; do
   dd if="$src" of="$tmp" bs=65536 skip="$i" count=1 2>/dev/null
   h=$(sha "$tmp"); rid=$(route "$h:$i"); len=$(wc -c < "$tmp" | tr -d ' ')
   [ -f "$store/chunks/$h" ] || cp "$tmp" "$store/chunks/$h"
   printf 'seg=%s,%s,%s,%s\n' "$i" "$len" "$h" "$rid" >> "$mf"; i=$((i+1))
 done
 rm -f "$tmp"; printf '%s\n' "$mf"
}
unpack(){
 mf=$1; out=$2; store=$(CDPATH= cd -- "$(dirname -- "$mf")/.." && pwd); tmp="$out.tmp.$$"; : > "$tmp"
 grep '^seg=' "$mf" | while IFS=, read -r a len h rid; do h=${h#seg=*}; cat "$store/chunks/$h"; done > "$tmp"
 exp=$(sed -n 's/^sha256=//p' "$mf"); got=$(sha "$tmp"); [ "$got" = "$exp" ] || { rm -f "$tmp"; echo 'MeumPack integrity failure' >&2; exit 3; }
 mv "$tmp" "$out"; printf '%s\n' "$out"
}
meta_get(){ f=$1; k=$2; d=$3; [ -f "$f.meta" ] && sed -n "s/^$k=//p" "$f.meta" | head -1 || true; }
play_raw(){
 f=$1; ext=${f##*.}; ext=$(printf '%s' "$ext" | tr 'A-Z' 'a-z')
 case "$ext" in
  wav)
    if command -v pw-play >/dev/null 2>&1; then exec pw-play "$f"; elif command -v aplay >/dev/null 2>&1; then exec aplay "$f"; else echo 'Need PipeWire pw-play or ALSA aplay for PCM WAV playback.' >&2; exit 20; fi ;;
  pcm|raw|sraw)
    rate=$(meta_get "$f" rate 48000); [ -n "$rate" ] || rate=48000
    ch=$(meta_get "$f" channels 2); [ -n "$ch" ] || ch=2
    fmt=$(meta_get "$f" format s16le); [ -n "$fmt" ] || fmt=s16le
    if command -v pw-play >/dev/null 2>&1; then exec pw-play --rate "$rate" --channels "$ch" --format "$fmt" "$f"; fi
    if command -v aplay >/dev/null 2>&1; then
      afmt=S16_LE; [ "$fmt" = s24le ] && afmt=S24_LE; [ "$fmt" = s32le ] && afmt=S32_LE
      exec aplay -r "$rate" -c "$ch" -f "$afmt" "$f"
    fi
    echo 'Need PipeWire pw-play or ALSA aplay for raw PCM playback.' >&2; exit 20 ;;
  ppm)
    if command -v chafa >/dev/null 2>&1; then exec chafa -f symbols "$f"; elif command -v display >/dev/null 2>&1; then exec display "$f"; elif command -v feh >/dev/null 2>&1; then exec feh "$f"; else echo 'Need chafa/display/feh for raw PPM viewing.' >&2; exit 21; fi ;;
  mid|midi)
    if command -v aplaymidi >/dev/null 2>&1; then exec aplaymidi "$f"; else echo 'Need aplaymidi for raw MIDI playback.' >&2; exit 22; fi ;;
  mseq)
    while IFS='\t' read -r p ms; do case "$p" in ''|'#'*) continue;; esac; clear 2>/dev/null || true; if command -v chafa >/dev/null 2>&1; then chafa -f symbols "$p"; else echo "$p"; fi; sleep "$(awk -v m="${ms:-100}" 'BEGIN{printf "%.3f",m/1000}')"; done < "$f" ;;
  *) echo "Rejected by native sCode media ABI: $f (raw/Meum data only)" >&2; exit 23 ;;
 esac
}
cmd=${1:-}; shift || true
case "$cmd" in
 pack) [ $# -eq 2 ] || { usage; exit 2; }; pack "$1" "$2" ;;
 unpack) [ $# -eq 2 ] || { usage; exit 2; }; unpack "$1" "$2" ;;
 probe)
   [ $# -eq 1 ] || { usage; exit 2; }; f=$1
   if grep -q '^MEUMPACK[12]$' "$f" 2>/dev/null; then cat "$f"; else printf 'raw=%s\nsha256=%s\nfi_route=%s\n' "$f" "$(sha "$f")" "$(route "$(sha "$f"):$f")"; fi ;;
 play)
   [ $# -eq 1 ] || { usage; exit 2; }; f=$1
   if grep -q '^MEUMPACK[12]$' "$f" 2>/dev/null; then
     store=$(CDPATH= cd -- "$(dirname -- "$f")/.." && pwd); base=$(sed -n 's/^file=//p' "$f"); tmp=${TMPDIR:-/tmp}/smeum-play.$$.$base
     trap 'rm -f "$tmp"' EXIT INT TERM; unpack "$f" "$tmp" >/dev/null; play_raw "$tmp"
   else play_raw "$f"; fi ;;
 ''|-h|--help|help) usage ;;
 *) usage; exit 2 ;;
esac
