#!/bin/bash
# curate-agent.sh — Memory curation for OpsMan agents
# Usage: curate-agent.sh <agent-name>
# Runs every 3 hours via cron, staggered by agent

set -euo pipefail

AGENT="${1:-}"
if [[ -z "$AGENT" ]]; then
  echo "Usage: curate-agent.sh <agent-name>"
  exit 1
fi

WORKSPACE="/home/ccuser/$AGENT"
MEMORY_DIR="$WORKSPACE/memory"
QUEUE_FILE="$WORKSPACE/queue.json"
STATUS_FILE="$WORKSPACE/status.json"
ARCHIVE_DIR="$MEMORY_DIR/archive"
LOG_FILE="/home/ccuser/shared/logs/curation.log"

# Ensure directories exist
mkdir -p "$ARCHIVE_DIR"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$AGENT] $1" >> "$LOG_FILE"
}

log "Starting curation"

# 1. Archive daily files older than 7 days
ARCHIVED=0
if [[ -d "$MEMORY_DIR" ]]; then
  for file in "$MEMORY_DIR"/*.md; do
    [[ -e "$file" ]] || continue
    filename=$(basename "$file")
    # Match YYYY-MM-DD.md pattern
    if [[ "$filename" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}\.md$ ]]; then
      file_date="${filename%.md}"
      cutoff=$(date -d "7 days ago" +%Y-%m-%d 2>/dev/null || date -v-7d +%Y-%m-%d 2>/dev/null)
      if [[ "$file_date" < "$cutoff" ]]; then
        mv "$file" "$ARCHIVE_DIR/"
        ((ARCHIVED++)) || true
        log "Archived old daily file: $filename"
      fi
    fi
  done
fi
log "Archived $ARCHIVED daily files"

# 2. Clean queue.json — remove completed tasks older than 24h
if [[ -f "$QUEUE_FILE" ]]; then
  CLEANED=0
  CUTOFF=$(date -d "24 hours ago" -Iseconds 2>/dev/null || date -v-24H -Iseconds 2>/dev/null)
  
  # Use jq to filter out old completed tasks
  if command -v jq &>/dev/null; then
    ORIGINAL_COUNT=$(jq '.tasks | length' "$QUEUE_FILE" 2>/dev/null || echo 0)
    
    jq --arg cutoff "$CUTOFF" '
      .tasks = [.tasks[] | select(
        .status != "completed" or
        .status != "done" or
        (.completed_at // .updated_at // .created // "2099-01-01") > $cutoff
      )]
    ' "$QUEUE_FILE" > "${QUEUE_FILE}.tmp" 2>/dev/null && mv "${QUEUE_FILE}.tmp" "$QUEUE_FILE"
    
    NEW_COUNT=$(jq '.tasks | length' "$QUEUE_FILE" 2>/dev/null || echo 0)
    CLEANED=$((ORIGINAL_COUNT - NEW_COUNT))
    [[ $CLEANED -lt 0 ]] && CLEANED=0
    log "Cleaned $CLEANED completed tasks from queue"
  fi
fi

# 3. Update status.json with fresh timestamp
if [[ -f "$STATUS_FILE" ]]; then
  if command -v jq &>/dev/null; then
    jq --arg ts "$(date -Iseconds)" '.last_curation = $ts' "$STATUS_FILE" > "${STATUS_FILE}.tmp" 2>/dev/null && \
      mv "${STATUS_FILE}.tmp" "$STATUS_FILE"
    log "Updated status.json timestamp"
  fi
fi

# 4. Calculate curation stats
MEMORY_FILES=$(find "$MEMORY_DIR" -maxdepth 1 -name "*.md" 2>/dev/null | wc -l || echo 0)
ARCHIVE_FILES=$(find "$ARCHIVE_DIR" -name "*.md" 2>/dev/null | wc -l || echo 0)
QUEUE_PENDING=$(jq '[.tasks[] | select(.status == "pending")] | length' "$QUEUE_FILE" 2>/dev/null || echo 0)

log "Curation complete: $MEMORY_FILES active memory files, $ARCHIVE_FILES archived, $QUEUE_PENDING pending tasks"

echo "[$AGENT] Curation complete at $(date '+%H:%M')"
