#!/bin/bash
# MyAIDev Method - Claude Code Status Line
# Displays branded project status in the Claude Code footer.
# Called by Claude Code with JSON context on stdin.

# ── Read Claude Code JSON input ──────────────────────────────────────────────
INPUT=$(cat 2>/dev/null || echo "{}")

# ── Parse fields from stdin JSON ─────────────────────────────────────────────
# NOTE: context_window.used_percentage is unreliable in status line hooks.
# Instead, read individual token counts from current_usage and calculate manually.
# See: github.com/anthropics/claude-code/issues/13783
CONTEXT_BASELINE=22600  # system prompt, tools, MCP tokens not visible to hooks

if command -v jq >/dev/null 2>&1; then
  eval "$(echo "$INPUT" | jq -r '
    "MODEL=" + (.model.display_name // "" | @sh) + "\n" +
    "CWD=" + (.cwd // .workspace.current_dir // "" | @sh) + "\n" +
    "CONTEXT_MAX=" + ((.context_window.context_window_size // 200000) | tostring)
  ' 2>/dev/null)"
else
  MODEL=""
  CWD=""
  CONTEXT_MAX=200000
fi

# Calculate context usage from baseline estimate (approximate)
CONTEXT_USED=$CONTEXT_BASELINE

if [ "$CONTEXT_MAX" -gt 0 ] && [ "$CONTEXT_USED" -gt 0 ]; then
  CTX_PCT=$((CONTEXT_USED * 100 / CONTEXT_MAX))
else
  CTX_PCT=0
fi
[ "$CTX_PCT" -gt 100 ] && CTX_PCT=100

# ── ccusage: fetch real token/cost data with caching ─────────────────────────
CCUSAGE_CACHE="/tmp/.myaidev_ccusage_cache"
CCUSAGE_LOCK="/tmp/.myaidev_ccusage.lock"
CCUSAGE_TTL=30  # seconds

CCUSAGE_TOKENS=""
CCUSAGE_COST=""

# Load cached data first (if it exists)
if [ -f "$CCUSAGE_CACHE" ]; then
  source "$CCUSAGE_CACHE"
fi

# Check if cache needs updating
ccusage_needs_update=false
if [ ! -f "$CCUSAGE_CACHE" ] || [ -z "$CCUSAGE_TOKENS" ]; then
  ccusage_needs_update=true
elif [ -f "$CCUSAGE_CACHE" ]; then
  cache_mtime=$(stat -c%Y "$CCUSAGE_CACHE" 2>/dev/null || stat -f%m "$CCUSAGE_CACHE" 2>/dev/null || echo 0)
  cache_age=$(( $(date +%s) - cache_mtime ))
  if [ "$cache_age" -ge "$CCUSAGE_TTL" ]; then
    ccusage_needs_update=true
  fi
fi

if [ "$ccusage_needs_update" = true ]; then
  # Try to acquire lock (non-blocking, using mkdir for atomicity)
  if mkdir "$CCUSAGE_LOCK" 2>/dev/null; then
    # Run ccusage with timeout, try npx first then bunx
    ccusage_output=""
    if command -v timeout >/dev/null 2>&1; then
      ccusage_output=$(timeout 5 npx ccusage 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g' | grep "│ Total" | head -1)
      if [ -z "$ccusage_output" ] && command -v bunx >/dev/null 2>&1; then
        ccusage_output=$(timeout 5 bunx ccusage 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g' | grep "│ Total" | head -1)
      fi
    elif command -v bunx >/dev/null 2>&1; then
      ccusage_output=$(bunx ccusage 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g' | grep "│ Total" | head -1)
    fi

    if [ -n "$ccusage_output" ]; then
      # Extract input tokens (col 4), output tokens (col 5), cost (col 9)
      cc_input=$(echo "$ccusage_output" | awk -F'│' '{print $4}' | sed 's/[^0-9]//g' | head -c 10)
      cc_output=$(echo "$ccusage_output" | awk -F'│' '{print $5}' | sed 's/[^0-9]//g' | head -c 10)
      cc_cost=$(echo "$ccusage_output" | awk -F'│' '{print $9}' | sed 's/^ *//;s/ *$//')

      if [ -n "$cc_input" ] && [ -n "$cc_output" ]; then
        cc_total=$((cc_input + cc_output))
        CCUSAGE_TOKENS=$(printf "%'d" "$cc_total" 2>/dev/null || echo "$cc_total")
        CCUSAGE_COST="$cc_cost"

        # Write to cache
        echo "CCUSAGE_TOKENS=\"$CCUSAGE_TOKENS\"" > "$CCUSAGE_CACHE"
        printf "CCUSAGE_COST=\"%s\"\n" "${CCUSAGE_COST//$/\\$}" >> "$CCUSAGE_CACHE"
      fi
    fi

    # Release lock
    rmdir "$CCUSAGE_LOCK" 2>/dev/null
  else
    # Lock held by another process — check for stale lock (>30s old)
    if [ -d "$CCUSAGE_LOCK" ]; then
      lock_mtime=$(stat -c%Y "$CCUSAGE_LOCK" 2>/dev/null || stat -f%m "$CCUSAGE_LOCK" 2>/dev/null || echo 0)
      lock_age=$(( $(date +%s) - lock_mtime ))
      if [ "$lock_age" -gt 30 ]; then
        rmdir "$CCUSAGE_LOCK" 2>/dev/null
      fi
    fi
    # Use whatever cached data we loaded above
  fi
fi

# ── Token formatting ─────────────────────────────────────────────────────────
format_tokens() {
  local t=$1
  # Strip commas for numeric comparison
  local raw=$(echo "$t" | sed 's/,//g')
  if [ "$raw" -ge 1000000 ] 2>/dev/null; then
    printf "%.1fM" "$(echo "$raw / 1000000" | bc -l 2>/dev/null || echo "0")"
  elif [ "$raw" -ge 1000 ] 2>/dev/null; then
    printf "%.1fK" "$(echo "$raw / 1000" | bc -l 2>/dev/null || echo "0")"
  else
    printf "%s" "$t"
  fi
}

# Format display values from ccusage data
if [ -n "$CCUSAGE_TOKENS" ]; then
  TOTAL_TOKENS_FMT=$(format_tokens "$CCUSAGE_TOKENS")
else
  TOTAL_TOKENS_FMT="N/A"
fi

if [ -n "$CCUSAGE_COST" ]; then
  COST_FMT="$CCUSAGE_COST"
else
  COST_FMT="N/A"
fi

# ── Local data sources ───────────────────────────────────────────────────────
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# MyAIDev version from install marker
VERSION=$(cat "$SCRIPT_DIR/.myaidev-version" 2>/dev/null || echo "?")

# Git branch
GIT_BRANCH=""
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
  GIT_BRANCH=$(git branch --show-current 2>/dev/null)
fi

# Installed skill count
SKILL_COUNT=0
if [ -d "$SCRIPT_DIR/skills" ]; then
  SKILL_COUNT=$(ls -d "$SCRIPT_DIR/skills"/*/ 2>/dev/null | wc -l | tr -d ' ')
fi

# MCP server count (from settings.json or project .claude/settings.json)
MCP_TOTAL=0
MCP_ENABLED=0
for SETTINGS_FILE in "$SCRIPT_DIR/settings.json" "$SCRIPT_DIR/../.mcp.json" "$HOME/.claude/settings.json"; do
  if [ -f "$SETTINGS_FILE" ] && command -v jq >/dev/null 2>&1; then
    if echo "$SETTINGS_FILE" | grep -q "mcp.json"; then
      # .mcp.json format: top-level "mcpServers" object
      MCP_TOTAL=$(jq '.mcpServers // {} | keys | length' "$SETTINGS_FILE" 2>/dev/null || echo "0")
      MCP_ENABLED="$MCP_TOTAL"
    else
      # settings.json format: "mcpServers" with optional "enabledMcpjsonServers"
      MCP_TOTAL=$(jq '.mcpServers // {} | keys | length' "$SETTINGS_FILE" 2>/dev/null || echo "0")
      HAS_ENABLED=$(jq 'has("enabledMcpjsonServers")' "$SETTINGS_FILE" 2>/dev/null)
      if [ "$HAS_ENABLED" = "true" ]; then
        MCP_ENABLED=$(jq '.enabledMcpjsonServers | length' "$SETTINGS_FILE" 2>/dev/null || echo "0")
      else
        MCP_ENABLED="$MCP_TOTAL"
      fi
    fi
    # Stop searching if we found MCP servers
    [ "$MCP_TOTAL" -gt 0 ] && break
  fi
done

# Abbreviate CWD
if [ -z "$CWD" ]; then
  CWD="$PWD"
fi
SHORT_CWD="${CWD/#$HOME/~}"
if [ "${#SHORT_CWD}" -gt 35 ]; then
  SHORT_CWD=".../${SHORT_CWD##*/}"
fi

# Shorten model name (e.g., "Claude Opus 4.6" -> "Opus 4.6")
SHORT_MODEL="${MODEL#Claude }"
[ -z "$SHORT_MODEL" ] && SHORT_MODEL="..."

# ── ANSI Colors ──────────────────────────────────────────────────────────────
CYAN='\033[0;36m'
BRIGHT_CYAN='\033[1;36m'
GREEN='\033[0;32m'
BRIGHT_GREEN='\033[1;32m'
YELLOW='\033[0;33m'
BRIGHT_YELLOW='\033[1;33m'
RED='\033[0;31m'
MAGENTA='\033[0;35m'
DIM='\033[2m'
BOLD='\033[1m'
RESET='\033[0m'

# MYAI in bright white, DEV in vivid orange
C_WHITE='\033[1;97m'
C_ORANGE='\033[1;38;2;255;140;0m'

# ── Build context usage bar ──────────────────────────────────────────────────
BAR_WIDTH=10
FILLED=$((CTX_PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))

if [ "$CTX_PCT" -lt 40 ]; then
  BAR_COLOR="$GREEN"
elif [ "$CTX_PCT" -lt 70 ]; then
  BAR_COLOR="$YELLOW"
else
  BAR_COLOR="$RED"
fi

BAR_FILLED=""
BAR_EMPTY=""
for ((i = 0; i < FILLED; i++)); do BAR_FILLED="${BAR_FILLED}█"; done
for ((i = 0; i < EMPTY; i++)); do BAR_EMPTY="${BAR_EMPTY}░"; done

# ── MCP status color ────────────────────────────────────────────────────────
if [ "$MCP_TOTAL" -eq 0 ]; then
  MCP_COLOR="$DIM"
  MCP_DOT="○"
elif [ "$MCP_ENABLED" -eq "$MCP_TOTAL" ]; then
  MCP_COLOR="$BRIGHT_GREEN"
  MCP_DOT="●"
elif [ "$MCP_ENABLED" -gt 0 ]; then
  MCP_COLOR="$BRIGHT_YELLOW"
  MCP_DOT="●"
else
  MCP_COLOR="$RED"
  MCP_DOT="●"
fi

# ── Line 1: Branding, model, branch, CWD, skills, context ───────────────────
LINE1=""

# Branding: MYAIDEV with white-to-orange gradient + version
LINE1="${C_WHITE}MYAI${C_ORANGE}DEV${RESET} ${DIM}v${VERSION}${RESET}"

# Model
LINE1="${LINE1} ${DIM}│${RESET} 🧠 ${BOLD}${SHORT_MODEL}${RESET}"

# Git branch
if [ -n "$GIT_BRANCH" ]; then
  LINE1="${LINE1} ${DIM}│${RESET} ${CYAN}⎇ ${GIT_BRANCH}${RESET}"
fi

# Working directory
LINE1="${LINE1} ${DIM}│${RESET} 📁 ${DIM}${SHORT_CWD}${RESET}"

# Skill count
if [ "$SKILL_COUNT" -gt 0 ]; then
  LINE1="${LINE1} ${DIM}│${RESET} ${CYAN}⬡${RESET} ${SKILL_COUNT}"
fi

# Context bar
LINE1="${LINE1} ${DIM}│${RESET} ${BAR_COLOR}[${BAR_FILLED}${DIM}${BAR_EMPTY}${RESET}${BAR_COLOR}]${RESET} ${CTX_PCT}%"

# ── Line 2: MCP, tokens, cost ───────────────────────────────────────────────
LINE2="  "

# MCP servers
LINE2="${LINE2}${CYAN}MCP${RESET} ${MCP_COLOR}${MCP_DOT}${MCP_ENABLED}/${MCP_TOTAL}${RESET}"

# Total tokens
LINE2="${LINE2} ${DIM}│${RESET} 💎 ${DIM}Total Tokens:${RESET} ${BOLD}${TOTAL_TOKENS_FMT}${RESET}"

# Total cost
LINE2="${LINE2}  ${DIM}Total Cost:${RESET} ${MAGENTA}${COST_FMT}${RESET}"

# ── Output ───────────────────────────────────────────────────────────────────
printf "%b\n" "$LINE1"
printf "%b\n" "$LINE2"
