#!/bin/bash

# cavekit — Global CLI for Cavekit
#
# Usage:
#   cavekit --monitor [--expanded]   Interactive launcher — pick build sites, launch in tmux
#   cavekit --status                 Show build site progress from any terminal
#   cavekit --kill                   Kill all Cavekit sessions
#   cavekit --analytics              Show trends across Cavekit cycles
#   cavekit --help                   Show this help

set -euo pipefail

TASK_ID_PATTERN='T-([A-Za-z0-9]+-)*[A-Za-z0-9]+'

resolve_script_dir() {
  local source="${BASH_SOURCE[0]}"

  while [[ -L "$source" ]]; do
    local dir
    dir="$(cd -P "$(dirname "$source")" && pwd)"
    source="$(readlink "$source")"
    [[ "$source" != /* ]] && source="${dir}/${source}"
  done

  cd -P "$(dirname "$source")" && pwd
}

count_frontier_tasks() {
  local frontier="$1"

  grep -E "^[[:space:]]*\\|[[:space:]]*${TASK_ID_PATTERN}[[:space:]]*\\||^[[:space:]]*-[[:space:]]+${TASK_ID_PATTERN}([[:space:]]|$)" "$frontier" 2>/dev/null \
    | grep -oE "$TASK_ID_PATTERN" \
    | sort -u \
    | wc -l \
    | tr -d ' '
}

SCRIPT_DIR="$(resolve_script_dir)"

usage() {
  cat <<'EOF'
cavekit — Cavekit CLI

Usage:
  cavekit --monitor [--expanded]   Pick build sites, launch parallel agents in tmux
  cavekit --status                 Show build site progress
  cavekit --analytics              Show trends across Cavekit cycles
  cavekit --kill                   Stop everything and clean up

Monitor modes:
  Default:    All agents in one tmux window (horizontal ≤3, tiled 4+)
  --expanded: One tmux window per agent with progress+activity dashboards

Examples:
  cavekit --monitor              Pick and launch build sites
  cavekit --monitor --expanded   Same, with full dashboard per agent
  cavekit --status               Check progress from another terminal
  cavekit --kill                 Stop all agents
EOF
}

# ─── --status ────────────────────────────────────────────────────────────────

do_status() {
  local PROJECT_ROOT
  PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"

  local found=false

  # Check for frontier files in the project directory
  for frontier in "$PROJECT_ROOT"/context/plans/*site*.md "$PROJECT_ROOT"/context/sites/*site*.md "$PROJECT_ROOT"/context/frontiers/*frontier*.md; do
    [[ -f "$frontier" ]] || continue
    found=true
    local name
    name=$(basename "$frontier" .md | sed -E 's/^(plan-|feature-frontier-|feature-|build-site-)//' | sed 's/-frontier$//')

    local total=0 done_count=0
    total=$(count_frontier_tasks "$frontier")

    # Count done from impl
    local done_ids=""
    for impl in "$PROJECT_ROOT"/context/impl/impl-*.md; do
      [[ -f "$impl" ]] || continue
      done_ids+=$(grep -iE 'DONE' "$impl" 2>/dev/null | grep -oE "$TASK_ID_PATTERN" || true)
      done_ids+=$'\n'
    done
    done_count=$(echo "$done_ids" | sort -u | grep -c 'T-' 2>/dev/null || true)

    # Check loop state
    local status_icon="·"
    if [[ -f "$PROJECT_ROOT/.claude/ralph-loop.local.md" ]]; then
      local iter
      iter=$(grep -m1 '^iteration:' "$PROJECT_ROOT/.claude/ralph-loop.local.md" 2>/dev/null | awk '{print $2}' || echo "?")
      local max_iter
      max_iter=$(grep -m1 '^max_iterations:' "$PROJECT_ROOT/.claude/ralph-loop.local.md" 2>/dev/null | awk '{print $2}' || echo "?")
      status_icon="⟳ iter ${iter}/${max_iter},"
    elif [[ "$total" -gt 0 && "$done_count" -ge "$total" ]]; then
      status_icon="✓"
    fi

    printf "  %-25s %s %s/%s tasks done\n" "$name:" "$status_icon" "$done_count" "$total"
  done

  if [[ "$found" == "false" ]]; then
    echo "  No active Cavekit sessions found."
    echo "  Run 'cavekit --monitor' to start."
  fi
}

# ─── --kill ──────────────────────────────────────────────────────────────────

do_kill() {
  # Kill cavekit tmux session
  local KILLED=0
  if tmux has-session -t "cavekit" 2>/dev/null; then
    tmux kill-session -t "cavekit" 2>/dev/null && KILLED=$((KILLED + 1))
  fi
  # Also kill any legacy cavekit-* sessions
  while IFS= read -r sess; do
    tmux kill-session -t "$sess" 2>/dev/null && KILLED=$((KILLED + 1))
  done < <(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep '^cavekit-' || true)

  # Clean stale ralph-loop state from main project
  local PROJECT_ROOT
  PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
  rm -f "$PROJECT_ROOT/.claude/ralph-loop.local.md"

  echo "Killed $KILLED sessions."
}

# ─── --monitor ───────────────────────────────────────────────────────────────

do_monitor() {
  local expanded_flag=""
  if [[ "${1:-}" == "--expanded" ]]; then
    expanded_flag="--expanded"
  fi

  command -v tmux &>/dev/null || { echo "tmux not found. Install: brew install tmux" >&2; exit 1; }
  command -v claude &>/dev/null || { echo "claude not found." >&2; exit 1; }

  # Ensure dependencies are installed
  if [[ ! -d "$SCRIPT_DIR/node_modules/@inquirer" ]]; then
    echo "Installing picker dependencies..."
    (cd "$SCRIPT_DIR" && npm install --silent) || { echo "Failed to install dependencies" >&2; exit 1; }
  fi

  # Run the picker — it writes selected paths to a temp file, interactive UI uses stdout/tty
  local PICKER_OUT
  PICKER_OUT=$(mktemp /tmp/cavekit-picker-XXXXXX)
  trap 'rm -f "$PICKER_OUT"' EXIT

  local TSX="$SCRIPT_DIR/node_modules/.bin/tsx"
  CAVEKIT_PICKER_OUTFILE="$PICKER_OUT" "$TSX" "$SCRIPT_DIR/cavekit-picker.ts"
  local picker_exit=$?

  if [[ $picker_exit -ne 0 ]]; then
    rm -f "$PICKER_OUT"
    exit 0
  fi

  # Read selected paths
  FRONTIER_ARGS=()
  while IFS= read -r line; do
    [[ -n "$line" ]] && FRONTIER_ARGS+=("$line")
  done < "$PICKER_OUT"
  rm -f "$PICKER_OUT"

  if [[ ${#FRONTIER_ARGS[@]} -eq 0 ]]; then
    echo "No frontiers selected."
    exit 0
  fi

  # Launch
  exec "$SCRIPT_DIR/cavekit-launch-session.sh" $expanded_flag "${FRONTIER_ARGS[@]}"
}

# ─── Main dispatch ───────────────────────────────────────────────────────────

case "${1:-}" in
  --help|-h|"")
    usage
    exit 0
    ;;
  --kill|kill)
    do_kill
    ;;
  --status)
    echo "Cavekit Agent Status:"
    do_status
    ;;
  --analytics)
    exec "$SCRIPT_DIR/cavekit-analytics.sh"
    ;;
  --monitor)
    shift
    do_monitor "$@"
    ;;
  *)
    echo "Unknown option: $1" >&2
    usage >&2
    exit 1
    ;;
esac
