#!/bin/bash
set -euo pipefail

# Usage: tools/implement/lock.sh [batch_id]
# Without argument: atomically finds and claims the next batch ready for implementation

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
REGISTRY="$ROOT_DIR/.smbatcher/REGISTRY.md"
BATCH_DIR="$ROOT_DIR/.smbatcher/batches"
LOCK_FILE="$ROOT_DIR/.smbatcher/REGISTRY.lock"

BATCH_ID="${1:-}"

# Auto-detect and claim batch if not provided
if [ -z "$BATCH_ID" ]; then
  # Use --claim for atomic find + status update (prevents race conditions)
  # Exit codes: 0=found, 1=no work, 2=error
  FIND_RESULT="$("$ROOT_DIR/tools/shared/find-next.sh" \
    --registry "$REGISTRY" \
    --mode batch \
    --phase implement \
    --format json \
    --claim)" || FIND_EXIT=$?
  FIND_EXIT=${FIND_EXIT:-0}

  if [ "$FIND_EXIT" -eq 2 ]; then
    # Actual error - show output and exit
    echo "[lock] Error during auto-detection:" >&2
    echo "$FIND_RESULT"
    exit 2
  fi

  BATCH_ID="$(echo "$FIND_RESULT" | "$ROOT_DIR/tools/run-python.sh" -c "import sys,json; d=json.load(sys.stdin); print(d.get('batch',''))")"
  CLAIMED="$(echo "$FIND_RESULT" | "$ROOT_DIR/tools/run-python.sh" -c "import sys,json; d=json.load(sys.stdin); print('true' if d.get('claimed') else 'false')")"

  if [ -z "$BATCH_ID" ]; then
    # Exit 1 = no work available (not an error, just nothing to do)
    echo "[lock] No batch found ready for implementation"
    echo "[lock] Run with explicit batch ID: $0 <batch_id>"
    echo "$FIND_RESULT"
    exit 1
  fi

  if [ "$CLAIMED" = "true" ]; then
    echo "[lock] Auto-detected and claimed batch: $BATCH_ID"
  else
    echo "[lock] Auto-detected batch: $BATCH_ID (already in progress)"
  fi
fi

"$ROOT_DIR/tools/run-python.sh" "$ROOT_DIR/tools/implement/lock.py" "$REGISTRY" "$LOCK_FILE" "$BATCH_DIR" "$BATCH_ID"
