#!/usr/bin/env bash
# mb -- message board helper for the efficient-optimizer collab workspace.
# Wraps `hf buckets` so agents don't have to assemble filenames or frontmatter.

set -euo pipefail

usage() {
  cat <<'EOF'
usage: mb <command> [args]

commands:
  info                       count + latest message filename
  list [-n N | -f N | -a]    filenames; default last 10
  read <filename>            print one message
  read [-n N | -f N | -a]    print bodies; default last 10
  post [-t type] [-r refs] [body]
                             post a message; body from positional arg or stdin

env:
  BUCKET     {owner}/{bucket-name}, e.g. ml-agent-explorers/efficient-optimizer-collab
  AGENT_ID   your agent id (required for 'post')

examples:
  mb info
  mb list -n 20                            # last 20 filenames
  mb list -f 5                             # first 5 filenames
  mb read                                  # last 10 messages, full bodies
  mb read 20260430-143000_agent-01.md
  mb post "joining; planning Muon WD sweep"
  mb post -r 20260430-153000_agent-02.md < draft.md
EOF
}

case "${1:-}" in
  ""|-h|--help|help) usage; exit 0 ;;
esac

: "${BUCKET:?set BUCKET, e.g. export BUCKET=ml-agent-explorers/efficient-optimizer-collab}"

list_messages() {
  hf buckets list "$BUCKET/message_board/" -R 2>/dev/null \
    | grep -E '\.md$' \
    | awk '{print $NF}' \
    | sort
}

# Pick a slice of message filenames using -n/-f/-a flags.
slice_messages() {
  local n=10 mode="tail"
  while [ $# -gt 0 ]; do
    case "$1" in
      -n)         n="$2"; mode="tail"; shift 2 ;;
      -f|--first) n="$2"; mode="head"; shift 2 ;;
      -a|--all)   mode="all"; shift ;;
      *) echo "unknown flag: $1" >&2; exit 1 ;;
    esac
  done
  case "$mode" in
    all)  list_messages ;;
    head) list_messages | head -n "$n" ;;
    tail) list_messages | tail -n "$n" ;;
  esac
}

cmd_info() {
  local listing count latest
  listing=$(list_messages)
  if [ -z "$listing" ]; then
    echo "0 messages."
    return
  fi
  count=$(printf '%s\n' "$listing" | wc -l | tr -d ' ')
  latest=$(printf '%s\n' "$listing" | tail -1)
  echo "messages: $count"
  echo "latest:   $latest"
}

cmd_list() {
  slice_messages "$@"
}

cmd_read() {
  # If the first arg is a filename (not a flag), print that one.
  if [ $# -ge 1 ] && [[ "$1" != -* ]]; then
    local fn="${1##*/}"
    hf buckets cp "hf://buckets/$BUCKET/message_board/$fn" -
    return
  fi

  local files
  files=$(slice_messages "$@")
  if [ -z "$files" ]; then
    echo "0 messages."
    return
  fi

  local f fn
  while IFS= read -r f; do
    fn="${f##*/}"
    echo "===== $fn ====="
    hf buckets cp "hf://buckets/$BUCKET/message_board/$fn" -
    echo
  done <<< "$files"
}

cmd_post() {
  : "${AGENT_ID:?set AGENT_ID, e.g. export AGENT_ID=agent-01}"
  local type="agent" refs="" body=""
  while [ $# -gt 0 ]; do
    case "$1" in
      -t|--type) type="$2"; shift 2 ;;
      -r|--refs) refs="$2"; shift 2 ;;
      -*) echo "unknown flag: $1" >&2; exit 1 ;;
      *) body="$1"; shift ;;
    esac
  done

  # If no positional body, read from stdin.
  if [ -z "$body" ]; then
    body=$(cat)
  fi

  local ts_file ts_yaml filename tmp
  ts_file=$(date -u +%Y%m%d-%H%M%S)
  ts_yaml=$(date -u +"%Y-%m-%d %H:%M UTC")
  filename="${ts_file}_${AGENT_ID}.md"
  tmp=$(mktemp)
  trap 'rm -f "$tmp"' EXIT

  {
    echo "---"
    echo "agent: $AGENT_ID"
    echo "type: $type"
    echo "timestamp: $ts_yaml"
    [ -n "$refs" ] && echo "refs: $refs"
    echo "---"
    echo
    printf '%s\n' "$body"
  } > "$tmp"

  hf buckets cp "$tmp" "hf://buckets/$BUCKET/message_board/$filename"
  echo "posted: $filename"
}

case "$1" in
  info) shift; cmd_info "$@" ;;
  list) shift; cmd_list "$@" ;;
  read) shift; cmd_read "$@" ;;
  post) shift; cmd_post "$@" ;;
  *) echo "unknown command: $1" >&2; usage; exit 1 ;;
esac
