#!/bin/bash
# sort-meetings nightly: синк митингов из Granola + разбор по проектам волта → отчёт в телеграм.
# Кроссплатформенный (Mac launchd / Pi systemd): пути и секреты из .env —
#   GRANOLA_VAULT (обязателен), GRANOLA_DATA_DIR (логи, опц.),
#   GRANOLA_GIT_SYNC=1 (git pull/commit/push волта вокруг прогона — для Pi),
#   TELEGRAM_BOT_TOKEN, TELEGRAM_OWNER_USER_ID, CLAUDE_BIN (опц.).
# Запуск руками: bash nightly.sh
set -u
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
set -a; source "$SCRIPT_DIR/.env"; set +a

VAULT="${GRANOLA_VAULT:?В .env нет GRANOLA_VAULT}"
# Скилл дёргает granola_sync.py уже изнутри claude — путь волта надо передать туда.
export OBSIDIAN_VAULT="$VAULT"
LOG_DIR="${GRANOLA_DATA_DIR:-$SCRIPT_DIR}"
LOG="$LOG_DIR/nightly.log"
CLAUDE_BIN="${CLAUDE_BIN:-$(command -v claude)}"
mkdir -p "$LOG_DIR"

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG"; }

if [ -z "${TELEGRAM_BOT_TOKEN:-}" ] || [ -z "${TELEGRAM_OWNER_USER_ID:-}" ]; then
  log "ERROR: нет токена/chat_id в .env"; exit 1
fi

PROMPT="Запусти скилл sort-meetings и выполни его процедуру полностью: синк с Granola, разбор всех кандидатов по проектам, перемещение файлов. Твой финальный ответ — это готовый отчёт для Наташи в формате из скилла (он уйдёт в телеграм как есть, без markdown-разметки). Если новых митингов не было — так и напиши одной строкой."

log "start: ночной разбор митингов"
cd "$VAULT" || { log "ERROR: волт недоступен"; exit 1; }

# Волт общий с маком и телефоном — подтянуть чужие правки до того, как двигать файлы.
if [ "${GRANOLA_GIT_SYNC:-0}" = "1" ]; then
  # autoStash: прошлый прогон мог оставить в дереве несохранённые мелочи
  # (та же отметка last_sync), а из-за них rebase отказывается стартовать.
  if ! git -C "$VAULT" -c rebase.autoStash=true pull --rebase >> "$LOG" 2>&1; then
    git -C "$VAULT" rebase --abort >> "$LOG" 2>&1
    log "WARN: git pull --rebase не прошёл — работаю на локальном состоянии волта"
  fi
fi

# Разбор идёт через claude -p. Две причины падений, и лечатся они по-разному:
# API рвёт соединение на середине ответа — помогает второй заход; упёршийся
# лимит сессии — помогает только время, ретраем его молотить бессмысленно.
ATTEMPTS=2
RETRY_PAUSE=60
REPORT=""
RC=1

for try in $(seq 1 $ATTEMPTS); do
  REPORT_FILE=$(mktemp)
  "$CLAUDE_BIN" -p "$PROMPT" \
    --permission-mode acceptEdits \
    --allowedTools "Bash(python3:*)" "Bash(mv:*)" "Bash(mkdir:*)" "Bash(ls:*)" "Bash(rmdir:*)" "Bash(head:*)" "Bash(find:*)" "Bash(wc:*)" "Read" "Glob" "Grep" \
    --output-format text \
    > "$REPORT_FILE" 2>>"$LOG"
  RC=$?
  REPORT=$(cat "$REPORT_FILE"); rm -f "$REPORT_FILE"

  if [ $RC -eq 0 ] && [ -n "$REPORT" ]; then
    [ "$try" -gt 1 ] && log "попытка $try: успех"
    break
  fi

  # Лимит приходит обычным ответом модели, а не ошибкой — ловим по тексту,
  # чтобы в логе было «упёрлись в лимит», а не безликое «отчёт пустой».
  if echo "$REPORT" | grep -qi "session limit\|usage limit"; then
    log "ЛИМИТ: $(echo "$REPORT" | head -1)"
    REPORT="Ночной разбор митингов не пошёл: упёрлись в лимит Claude. $(echo "$REPORT" | head -1)"
    RC=0
    break
  fi

  if [ "$try" -lt $ATTEMPTS ]; then
    log "попытка $try: claude rc=$RC, отчёт пустой — повтор через ${RETRY_PAUSE}с"
    sleep $RETRY_PAUSE
  fi
done

if [ $RC -ne 0 ] || [ -z "$REPORT" ]; then
  log "ERROR: claude rc=$RC, отчёт пустой (попыток: $ATTEMPTS)"
  REPORT="Ночной разбор митингов не отработал (rc=$RC, попыток: $ATTEMPTS) — глянь $LOG"
else
  log "ok: отчёт получен (${#REPORT} символов)"
fi

# Перемещённые транскрипты уезжают на гитхаб сразу: иначе мак увидит их только
# своим автосинком и рискует встретить конфликтом.
if [ "${GRANOLA_GIT_SYNC:-0}" = "1" ]; then
  git -C "$VAULT" add -A >> "$LOG" 2>&1
  if ! git -C "$VAULT" diff --cached --quiet; then
    git -C "$VAULT" commit -m "sort-meetings: ночной разбор $(date +%Y-%m-%d)" >> "$LOG" 2>&1 \
      && git -C "$VAULT" push >> "$LOG" 2>&1 || log "WARN: git push не прошёл"
  fi
fi

# Телеграм не принимает >4096 символов
REPORT="${REPORT:0:3900}"

TG="https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN"
SEND_RC=$(curl -s -o /dev/null -w '%{http_code}' -X POST "$TG/sendMessage" \
  --data-urlencode "chat_id=$TELEGRAM_OWNER_USER_ID" \
  --data-urlencode "text=$REPORT")
log "sendMessage: HTTP $SEND_RC"
