#!/usr/bin/env bash
# 值班表：同一個專案同時只准一個工人（幫手或 session）。規則見 root AGENTS.md「總機與幫手」。
#   busy.sh claim <專案> "<一句話在做什麼>" [--force]   進專案時登記；已有活的登記會拒絕（exit 1）並印出誰
#   busy.sh release <專案>                              離開前撤掉自己的登記
#   busy.sh check <專案>                                 空的 exit 0；有人 exit 1 並印出誰
#   busy.sh list                                         列出所有活的登記；程序已不在的視為過期，自動清掉
# 檔案：~/projects/.busy/<專案>，內容 session= pid= since= task=。不進 git。
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DIR="$ROOT/.busy"
mkdir -p "$DIR"

slug() { printf '%s' "$1" | sed 's#/#__#g; s#[[:space:]]#_#g'; }
alive() { kill -0 "$1" 2>/dev/null; }
show() {  # $1 = 檔
  local f="$1" name session pid since task
  name="$(basename "$f")"
  session=$(sed -n 's/^session=//p' "$f"); pid=$(sed -n 's/^pid=//p' "$f")
  since=$(sed -n 's/^since=//p' "$f");     task=$(sed -n 's/^task=//p' "$f")
  printf '%s\tpid %s\tsince %s\tsession %s\n\t%s\n' "$name" "$pid" "$since" "${session:0:8}" "$task"
}
sweep() {  # 清掉程序已不在的登記
  local f pid
  for f in "$DIR"/*; do
    [ -e "$f" ] || continue
    pid=$(sed -n 's/^pid=//p' "$f")
    if [ -z "$pid" ] || ! alive "$pid"; then
      echo "過期（程序 ${pid:-?} 已不在），清掉：$(basename "$f")" >&2
      rm -f "$f"
    fi
  done
}

cmd="${1:-}"; shift || true
case "$cmd" in
  claim)
    [ $# -ge 2 ] || { echo "用法：busy.sh claim <專案> \"<在做什麼>\" [--force]" >&2; exit 2; }
    proj="$(slug "$1")"; task="$2"; force="${3:-}"
    sweep
    f="$DIR/$proj"
    if [ -e "$f" ] && [ "$force" != "--force" ]; then
      echo "有人在做 $1：" >&2; show "$f" >&2
      echo "確定是殘留才加 --force。" >&2
      exit 1
    fi
    printf 'session=%s\npid=%s\nsince=%s\ntask=%s\n' \
      "${CLAUDE_CODE_SESSION_ID:-unknown}" "${CLAUDE_PID:-$PPID}" "$(date -Iminutes)" "$task" > "$f"
    echo "已登記 $1（pid ${CLAUDE_PID:-$PPID}）：$task"
    ;;
  release)
    [ $# -ge 1 ] || { echo "用法：busy.sh release <專案>" >&2; exit 2; }
    f="$DIR/$(slug "$1")"
    if [ -e "$f" ]; then rm -f "$f"; echo "已撤掉 $1 的登記"; else echo "$1 本來就沒有登記"; fi
    ;;
  check)
    [ $# -ge 1 ] || { echo "用法：busy.sh check <專案>" >&2; exit 2; }
    sweep
    f="$DIR/$(slug "$1")"
    if [ -e "$f" ]; then echo "有人在做 $1："; show "$f"; exit 1; else echo "$1 沒人在做"; fi
    ;;
  list)
    sweep
    n=0
    for f in "$DIR"/*; do [ -e "$f" ] || continue; show "$f"; n=$((n+1)); done
    [ "$n" -gt 0 ] || echo "值班表是空的"
    ;;
  *)
    sed -n '2,7p' "$0" >&2; exit 2 ;;
esac
