#!/bin/bash
# Fix CC sync system issues

REPO_PATH="/root/rateright-growth"
CC_DIR="$REPO_PATH/.claude"

echo "=== Fixing CC Sync Issues ==="

# 1. Fix Git permissions
echo "1. Setting .claude directory permissions for ccuser..."
chown -R ccuser:ccuser "$CC_DIR"
chmod 755 "$CC_DIR"

# 2. Test CC installation
echo "2. Testing CC installation for ccuser..."
if sudo -u ccuser command -v claude >/dev/null 2>&1; then
  CC_PATH=$(sudo -u ccuser command -v claude)
  echo "   ✓ CC found at: $CC_PATH"
else
  echo "   ✗ CC not found for ccuser"
  echo "   Install with: sudo -u ccuser pip install claude-cli"
fi

# 3. Create Git pre-commit hook for format validation
echo "3. Creating Git pre-commit hook..."
cat > "$REPO_PATH/.git/hooks/pre-commit" << 'EOF'
#!/bin/bash
# Validate INBOX.md format before commit
if git diff --cached --name-only | grep -q "\.claude/INBOX.md"; then
  echo "Validating INBOX.md format..."
  if ! grep -q "^## PENDING$" .claude/INBOX.md; then
    echo "Error: INBOX.md missing ## PENDING section"
    exit 1
  fi
  echo "✓ INBOX.md format valid"
fi
EOF
chmod +x "$REPO_PATH/.git/hooks/pre-commit"

# 4. Update cc-poll with proper error handling and timeout
echo "4. Updating cc-poll script with error handling..."
cat > /usr/local/bin/cc-poll << 'EOF'
#!/bin/bash
# CC polling daemon with error handling and timeouts

REPO_PATH="/root/rateright-growth"
CC_DIR="$REPO_PATH/.claude"
LOG_FILE="$CC_DIR/cc-poll.log"
TIMEOUT_MINUTES=30

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

process_task() {
  local task_id="$1"
  log "Processing task: $task_id"
  
  # Update status to working with timestamp
  sed -i "s/Current Status: idle/Current Status: working/" "$CC_DIR/STATUS.md"
  sed -i "s/Last Check: .*/Last Check: $(date)/" "$CC_DIR/STATUS.md"
  
  # Run CC with timeout
  timeout ${TIMEOUT_MINUTES}m sudo -u ccuser claude --prompt "Process task from $CC_DIR/INBOX.md" 2>>"$LOG_FILE"
  local exit_code=$?
  
  if [ $exit_code -eq 0 ]; then
    log "Task $task_id completed successfully"
    # Move task from PENDING to COMPLETED
    sed -i "/^### Task: $task_id$/,/^$/d" "$CC_DIR/INBOX.md"
    sed -i "/^## COMPLETED$/a\\
### Task: $task_id (completed at $(date))" "$CC_DIR/INBOX.md"
  elif [ $exit_code -eq 124 ]; then
    log "Task $task_id timed out after ${TIMEOUT_MINUTES} minutes"
    sed -i "s/Current Status: working/Current Status: error (timeout)/" "$CC_DIR/STATUS.md"
    # Move to FAILED section
    sed -i "/^### Task: $task_id$/,/^$/d" "$CC_DIR/INBOX.md"
    sed -i "/^## FAILED$/a\\
### Task: $task_id (failed - timeout at $(date))" "$CC_DIR/INBOX.md"
  else
    log "Task $task_id failed with exit code $exit_code"
    sed -i "s/Current Status: working/Current Status: error (code $exit_code)/" "$CC_DIR/STATUS.md"
  fi
  
  # Git commit and push
  cd "$REPO_PATH"
  git add "$CC_DIR"/*.md 2>/dev/null
  git commit -m "CC: Processed task $task_id" 2>/dev/null || true
  git push origin main 2>/dev/null || true
}

check_stuck_tasks() {
  # Check if STATUS has been "working" for too long
  if grep -q "Current Status: working" "$CC_DIR/STATUS.md"; then
    local last_check=$(grep "Last Check:" "$CC_DIR/STATUS.md" | cut -d: -f2- | xargs)
    if [ -n "$last_check" ]; then
      local last_epoch=$(date -d "$last_check" +%s 2>/dev/null || echo 0)
      local now_epoch=$(date +%s)
      local diff_minutes=$(( (now_epoch - last_epoch) / 60 ))
      
      if [ $diff_minutes -gt $TIMEOUT_MINUTES ]; then
        log "Detected stuck task (working for ${diff_minutes} minutes), resetting..."
        sed -i "s/Current Status: working/Current Status: idle (stuck reset)/" "$CC_DIR/STATUS.md"
      fi
    fi
  fi
}

main_loop() {
  while true; do
    cd "$REPO_PATH"
    git pull origin main 2>/dev/null
    
    check_stuck_tasks
    
    # Check for pending tasks
    if [ -f "$CC_DIR/INBOX.md" ]; then
      # Get first pending task
      task_line=$(sed -n '/^## PENDING$/,/^##/p' "$CC_DIR/INBOX.md" | grep -m1 "^### Task:")
      if [ -n "$task_line" ]; then
        task_id=$(echo "$task_line" | sed 's/^### Task: //' | awk '{print $1}')
        if [ -n "$task_id" ]; then
          process_task "$task_id"
        fi
      fi
    fi
    
    sleep 300  # 5 minutes
  done
}

# Create FAILED section if not exists
if [ -f "$CC_DIR/INBOX.md" ] && ! grep -q "^## FAILED$" "$CC_DIR/INBOX.md"; then
  sed -i '/^## COMPLETED$/a\\
## FAILED' "$CC_DIR/INBOX.md"
fi

# Start main loop
main_loop
EOF

chmod +x /usr/local/bin/cc-poll

# 5. Test Git authentication for ccuser
echo "5. Testing Git authentication for ccuser..."
if sudo -u ccuser bash -c "cd '$REPO_PATH' && git pull origin main 2>&1" | grep -q "fatal"; then
  echo "   ⚠️  ccuser may have Git auth issues"
  echo "   Fix: Copy SSH keys or use HTTPS token"
else
  echo "   ✓ ccuser can pull from repo"
fi

# 6. Update systemd service
echo "6. Updating systemd service..."
systemctl stop cc-poll 2>/dev/null || true
systemctl daemon-reload

echo ""
echo "=== Fixes Applied ==="
echo "1. Permissions: .claude owned by ccuser"
echo "2. CC path: Tested installation"
echo "3. Git hook: Pre-commit validation added"
echo "4. cc-poll: Added error handling, timeouts, stuck task detection"
echo "5. Git auth: Tested ccuser access"
echo "6. FAILED section: Added to INBOX.md"
echo ""
echo "Start: systemctl start cc-poll"
echo "Status: systemctl status cc-poll"
echo "Logs: tail -f $CC_DIR/cc-poll.log"