#!/bin/bash
# Daily token usage statistics for all OpenClaw agents
# Usage: bash run.sh [YYYY-MM-DD]

set -e

# Parse date argument (default to yesterday)
# Supports both GNU date (Linux) and BSD date (macOS)
if [ -n "$1" ]; then
    # User provided a date - validate and use it directly if it's in YYYY-MM-DD format
    if [[ "$1" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
        DATE="$1"
    else
        # Try to parse the date string
        DATE=$(date -d "$1" +%Y-%m-%d 2>/dev/null || date -j -f "%Y-%m-%d" "$1" +%Y-%m-%d 2>/dev/null || date +%Y-%m-%d)
    fi
else
    # Default to yesterday
    DATE=$(date -d "yesterday" +%Y-%m-%d 2>/dev/null || date -v-1d +%Y-%m-%d 2>/dev/null || date +%Y-%m-%d)
fi

AGENTS_DIR="$HOME/.openclaw/agents"
CONFIG_FILE="$HOME/.openclaw/openclaw.json"
TMP_DIR="/tmp/openclaw-stats-$$"

# Pricing (per 1M tokens in USD)
# MiniMax M2.5: ¥1/1M tokens ≈ $0.14/1M (¥7.2=$1)
MINIMAX_INPUT=0.14
MINIMAX_OUTPUT=0.14

# AWS Bedrock Claude 3.5 Sonnet
BEDROCK_INPUT=3.0          # $3/1M input tokens
BEDROCK_OUTPUT=15.0        # $15/1M output tokens
BEDROCK_CACHE_READ=0.30    # $0.30/1M cache read tokens
BEDROCK_CACHE_WRITE=3.75   # $3.75/1M cache write tokens

mkdir -p "$TMP_DIR"

# Detect current model from config
MODEL="Unknown"
if [ -f "$CONFIG_FILE" ]; then
    MODEL=$(grep -o '"model":"[^"]*"' "$CONFIG_FILE" 2>/dev/null | head -1 | cut -d'"' -f4 || echo "Unknown")
fi

# Initialize totals
TOTAL_IN=0
TOTAL_OUT=0
TOTAL_CACHE_R=0
TOTAL_CACHE_W=0
TOTAL_LINES=0
AGENT_COUNT=0

# Check if agents directory exists
if [ ! -d "$AGENTS_DIR" ]; then
    echo "## OpenClaw Daily - $DATE"
    echo ""
    echo "⚠️ No agents directory found at: $AGENTS_DIR"
    exit 0
fi

# Process all agents
for AGENT_DIR in "$AGENTS_DIR"/*/; do
    [ ! -d "$AGENT_DIR" ] && continue

    AGENT_NAME=$(basename "$AGENT_DIR")
    SESSIONS_DIR="$AGENT_DIR/sessions"

    [ ! -d "$SESSIONS_DIR" ] && continue

    TMP_FILE="$TMP_DIR/$AGENT_NAME.tmp"

    # Extract sessions for the specified date
    grep -h "$DATE" "$SESSIONS_DIR"/*.jsonl > "$TMP_FILE" 2>/dev/null || true

    [ ! -s "$TMP_FILE" ] && continue

    # Parse token usage
    IN=$(grep -o '"input":[0-9]*' "$TMP_FILE" | cut -d: -f2 | tr -d ',' | awk '{s+=$1}END{print s+0}')
    OUT=$(grep -o '"output":[0-9]*' "$TMP_FILE" | cut -d: -f2 | tr -d ',' | awk '{s+=$1}END{print s+0}')
    CACHE_R=$(grep -o '"cacheRead":[0-9]*' "$TMP_FILE" | cut -d: -f2 | tr -d ',' | awk '{s+=$1}END{print s+0}')
    CACHE_W=$(grep -o '"cacheWrite":[0-9]*' "$TMP_FILE" | cut -d: -f2 | tr -d ',' | awk '{s+=$1}END{print s+0}')
    LINES=$(wc -l < "$TMP_FILE" | tr -d ' ')

    # Skip if no data
    [ "$IN" -eq 0 ] && [ "$OUT" -eq 0 ] && [ "$CACHE_R" -eq 0 ] && [ "$CACHE_W" -eq 0 ] && continue

    # Accumulate totals
    TOTAL_IN=$((TOTAL_IN + IN))
    TOTAL_OUT=$((TOTAL_OUT + OUT))
    TOTAL_CACHE_R=$((TOTAL_CACHE_R + CACHE_R))
    TOTAL_CACHE_W=$((TOTAL_CACHE_W + CACHE_W))
    TOTAL_LINES=$((TOTAL_LINES + LINES))
    AGENT_COUNT=$((AGENT_COUNT + 1))
done

# Cleanup temp files
rm -rf "$TMP_DIR"

# Check if any data was found
if [ "$AGENT_COUNT" -eq 0 ]; then
    echo "## OpenClaw Daily - $DATE"
    echo ""
    echo "ℹ️ No data found for this date"
    exit 0
fi

TOTAL_TOKENS=$((TOTAL_IN + TOTAL_OUT + TOTAL_CACHE_R + TOTAL_CACHE_W))

# Calculate costs based on model
# MiniMax: input + output (cache read/write typically free or included)
COST_MINIMAX=$(awk -v tin="$TOTAL_IN" -v tout="$TOTAL_OUT" \
    -v pin="$MINIMAX_INPUT" -v pout="$MINIMAX_OUTPUT" \
    'BEGIN {printf "%.2f", (tin / 1000000 * pin) + (tout / 1000000 * pout)}')

# Bedrock: input + output + cache read + cache write
COST_BEDROCK=$(awk -v tin="$TOTAL_IN" -v tout="$TOTAL_OUT" \
    -v tcr="$TOTAL_CACHE_R" -v tcw="$TOTAL_CACHE_W" \
    -v pin="$BEDROCK_INPUT" -v pout="$BEDROCK_OUTPUT" \
    -v pcr="$BEDROCK_CACHE_READ" -v pcw="$BEDROCK_CACHE_WRITE" \
    'BEGIN {printf "%.2f", (tin / 1000000 * pin) + (tout / 1000000 * pout) + (tcr / 1000000 * pcr) + (tcw / 1000000 * pcw)}')

# Detect provider from model name
PROVIDER="Unknown"
COST_DISPLAY=""
COST_VALUE=0

if [[ "$MODEL" =~ [Mm]ini[Mm]ax|abab ]]; then
    # MiniMax models
    PROVIDER="MiniMax"
    COST_VALUE=$COST_MINIMAX
    COST_DISPLAY="\$$COST_MINIMAX"
elif [[ "$MODEL" =~ [Cc]laude|[Aa]nthropic|bedrock ]]; then
    # Bedrock/Claude models
    PROVIDER="Bedrock (Claude)"
    COST_VALUE=$COST_BEDROCK
    COST_DISPLAY="\$$COST_BEDROCK"
else
    # Unknown model - show both estimates
    PROVIDER="Unknown (showing both)"
    COST_DISPLAY="MiniMax: \$$COST_MINIMAX | Bedrock: \$$COST_BEDROCK"
fi

# Format numbers with thousands separator (fallback to plain number if LC_NUMERIC not available)
format_number() {
    local num=$1
    if command -v numfmt >/dev/null 2>&1; then
        numfmt --grouping "$num" 2>/dev/null || echo "$num"
    else
        printf "%'d" "$num" 2>/dev/null || echo "$num"
    fi
}

IN_FMT=$(format_number $TOTAL_IN)
OUT_FMT=$(format_number $TOTAL_OUT)
CACHE_R_FMT=$(format_number $TOTAL_CACHE_R)
CACHE_W_FMT=$(format_number $TOTAL_CACHE_W)
TOTAL_FMT=$(format_number $TOTAL_TOKENS)

# Output results in clean, formatted style
cat <<EOF
========================================
📊 OpenClaw Daily Stats - $DATE
========================================

📈 Token Usage
   Input:       $IN_FMT
   Output:      $OUT_FMT
   Cache Read:  $CACHE_R_FMT
   Cache Write: $CACHE_W_FMT
   ────────────────────────────────
   Total:       $TOTAL_FMT

💬 Messages: ~$TOTAL_LINES ($AGENT_COUNT agents)

💰 Cost Estimate ($PROVIDER)
   $COST_DISPLAY

⚙️  Model: $MODEL
========================================
EOF
