#!/bin/bash
# Pyramid-Autopilot (Pi/Linux): startet Claude-Sessions in Endlosschleife.
# Läuft eine Session ins 5h-Limit, wird alle 20 Minuten neu versucht.
# Start (am besten in tmux):  tmux new -d -s pyramid ./autopilot.sh
# Wieder reinschauen:         tmux attach -t pyramid   (verlassen: Strg+B, dann D)
# PAUSIEREN:                  touch ~/pyramid/PAUSE    (greift vor der nächsten Session)
# FORTSETZEN:                 rm ~/pyramid/PAUSE
# GANZ STOPPEN:               tmux kill-session -t pyramid
cd "$(dirname "$0")"
export PATH="$HOME/.local/bin:$HOME/flutter/bin:$PATH"

# --- Zwei Claude-Konten mit automatischem Wechsel bei 5h-Limit ---
# Konto "pyramid" = Profil ~/.claude-pyramid (Standard fuer diese Arbeit),
# Konto "haupt"   = Profil ~/.claude (springt ein, wenn pyramid am Limit ist).
ACCOUNT_FILE="$HOME/.claude-accounts/active"
get_account() { cat "$ACCOUNT_FILE" 2>/dev/null || echo pyramid; }

apply_account() {
  if [ "$(get_account)" = "haupt" ]; then
    export CLAUDE_CONFIG_DIR="$HOME/.claude"
  else
    export CLAUDE_CONFIG_DIR="$HOME/.claude-pyramid"
  fi
}

switch_account() {
  local cur next
  cur=$(get_account)
  if [ "$cur" = "pyramid" ]; then next=haupt; else next=pyramid; fi
  mkdir -p "$HOME/.claude-accounts"
  echo "$next" > "$ACCOUNT_FILE"
  notify_matrix "🔺 Autopilot: 5h-Limit auf Konto '$cur' erreicht – wechsle auf Konto '$next' und arbeite direkt weiter."
}

JUST_SWITCHED=0

# --- Matrix-Statusberichte (Raum "🔺 Pyramid Autopilot", Token vom Gatus-Bot) ---
MATRIX_URL="http://127.0.0.1:6167"
MATRIX_ROOM="!sYfOwD4Dw4jBDTlNmL:steggi-matrix.work"
MATRIX_TOKEN="$(grep -s '^MATRIX_TOKEN=' "$HOME/gatus/.env" | cut -d= -f2-)"

notify_matrix() {
  [ -z "$MATRIX_TOKEN" ] && return 0
  local body
  body=$(python3 -c 'import json,sys; print(json.dumps({"msgtype":"m.text","body":sys.stdin.read().strip()}))' <<< "$1")
  curl -s -m 10 -X PUT \
    "$MATRIX_URL/_matrix/client/v3/rooms/$MATRIX_ROOM/send/m.room.message/autopilot$(date +%s%N)" \
    -H "Authorization: Bearer $MATRIX_TOKEN" -H "Content-Type: application/json" \
    -d "$body" > /dev/null || true
}

PROMPT="Lies CLAUDE.md. Arbeite in dieser Reihenfolge:  (1) Review-Pass: Gehe die in ROADMAP.md/PROGRESS.md als erledigt markierten Punkte durch,  prüfe den zugehörigen Code kritisch und überarbeite/verbessere ihn, wo nötig.  Führe in PROGRESS.md einen Abschnitt 'Fable-5-Review' und hake dort jeden geprüften Punkt ab,  damit bereits reviewte Punkte nicht erneut geprüft werden.  (2) Wenn alle erledigten Punkte reviewt sind, arbeite ROADMAP.md Punkt für Punkt weiter ab.  Halte dich strikt an den Arbeitszyklus (PROGRESS.md pflegen, kleine Commits + Push).  Arbeite so viel ab wie möglich."

while true; do
  if [ -f PAUSE ]; then
    echo "===== $(date '+%F %T') PAUSE aktiv (rm PAUSE zum Fortsetzen) - pruefe wieder in 10 Minuten ====="
    sleep 600
    continue
  fi
  apply_account
  echo "===== $(date '+%F %T') Neue Claude-Session (Konto $(get_account)) =====" | tee -a autopilot.log
  BEFORE=$(git rev-parse HEAD 2>/dev/null)
  SESSION_OUT=$(mktemp)
  claude -p "$PROMPT" --model claude-fable-5 --dangerously-skip-permissions 2>&1 | tee -a autopilot.log "$SESSION_OUT"
  AFTER=$(git rev-parse HEAD 2>/dev/null)
  if [ -n "$BEFORE" ] && [ "$BEFORE" != "$AFTER" ]; then
    COMMITS=$(git log --oneline --no-decorate "$BEFORE..$AFTER" | head -15)
    NEXT=$(grep -m1 -A3 "Offen/Nächster Schritt" PROGRESS.md)
    notify_matrix "🔺 Pyramid-Autopilot $(date '+%H:%M') – Session fertig.

Neue Commits:
$COMMITS

$NEXT"
  fi
  # 5h-Limit erkannt? -> sofort aufs andere Konto wechseln statt zu warten
  if grep -qiE "hit your.*limit|usage limit|session limit" "$SESSION_OUT"; then
    rm -f "$SESSION_OUT"
    if [ "$JUST_SWITCHED" != "1" ]; then
      switch_account
      JUST_SWITCHED=1
      continue
    fi
    JUST_SWITCHED=0
    echo "===== $(date '+%F %T') Beide Konten am Limit - naechster Versuch in 20 Minuten =====" | tee -a autopilot.log
    sleep 1200
    continue
  fi
  rm -f "$SESSION_OUT"
  JUST_SWITCHED=0

  echo "===== $(date '+%F %T') Session beendet - Neustart in 20 Minuten (Strg+C zum Stoppen) =====" | tee -a autopilot.log
  sleep 1200
done
