#!/bin/bash
# Полное обновление таблицы «mars fin»: заносы + маржа/P&L + Касса + План-факт.
# Для деплоя на Pi (systemd timer 8:00). Использует venv, если он есть, иначе системный python3.
# Запуск: bash update_all.sh
#
# Сбои НЕ роняют весь прогон, но и не теряются: каждый собирается в WARNINGS и уходит
# в Телеграм одним сообщением в конце (раньше «|| echo WARN» писал в никуда — на Pi
# этого никто не видел).
set -u
cd "$(dirname "$0")"
mkdir -p .sdd

PY=python3
[ -x ./venv/bin/python3 ] && PY=./venv/bin/python3

WARNINGS=""
run() {                       # run "человеческое имя шага" команда…
  local name="$1"; shift
  echo ">>> $name"
  if ! "$@"; then
    echo ">>> WARN: шаг «$name» не удался"
    WARNINGS="${WARNINGS}
• ${name}"
  fi
}

notify_failures() {
  [ -z "$WARNINGS" ] && return 0
  local tok chat msg
  tok=$(grep -E '^TELEGRAM_BOT_TOKEN=' .env | cut -d= -f2-)
  chat=$(grep -E '^TELEGRAM_CHAT_ID=' .env | cut -d= -f2-)
  msg="⚠️ finsync ($(date '+%d.%m %H:%M')): шаги не отработали:${WARNINGS}"
  if [ -n "$tok" ] && [ -n "$chat" ]; then
    curl -s -o /dev/null --data-urlencode "text=${msg}" \
         --data "chat_id=${chat}" "https://api.telegram.org/bot${tok}/sendMessage" || true
  fi
  echo "$msg"
}
trap notify_failures EXIT

# Наличная выручка из AlfaCRM → Финтабло (счёт «Наличные»). Банк синкается сам,
# нал — только скриптом; дедуп по externalId делает ежедневный повтор безопасным.
# Текущий + прошлый месяц (ловим поздние платежи на стыке).
CUR_MM=$(date '+%m.%Y')
PREV_MM=$(date -d "$(date +%Y-%m-01) -1 day" '+%m.%Y' 2>/dev/null || date -v1d -v-1d '+%m.%Y')
NEXT_MM=$(date -d "$(date +%Y-%m-01) +1 month" '+%m.%Y' 2>/dev/null || date -v1d -v+1m '+%m.%Y')
for MM in "$PREV_MM" "$CUR_MM"; do
  run "наличная выручка AlfaCRM $MM" $PY enter_alfa_income.py "$MM" --commit
done

# Расходы Оли из её таблицы (обе стороны, дедуп/orphan-safe):
#  - оплаченные (Саша+Оплачено) → факт с наличных (держит баланс кассы честным)
#  - неоплаченные → план (плановые операции plansync:olya:*, текущий+след. месяц)
run "наличные расходы Оли (факт)" $PY enter_cash_expenses.py --commit
for MM in "$CUR_MM" "$NEXT_MM"; do
  run "план событий Оли $MM" $PY enter_olya_plan.py "$MM" --commit
done

# Снять отработавшие планки: факт пришёл — плановая операция в Финтабло больше не нужна.
# Пока она висит, прогноз Финтабло просит те же деньги второй раз. Раньше это делал только
# ручной plan_sync 25-го числа, и оплаченное копилось неделями: 03.08.2026 накопилось пять
# планок на 738 800 ₽, из них ЗП педагогов 592 150 (выплачена 31.07) и две админские,
# висевшие с 20.07. Стоит ПОСЛЕ заносов выше — матчить надо по свежему факту — и до отчёта
# в 09:00. Матчинг тот же каскад, что в отчёте, но порог строже: удаляем только при
# покрытии ≥95% (RETIRE_MIN_COVER), недоплату не хороним. Перед удалением plan_sync пишет
# журнал exports/plansync_journal_*.json с полными копиями — есть из чего восстановить.
run "снять отработавшие планки" $PY plan_sync.py --retire-only --commit

echo ">>> маржа/P&L (пересчёт из CRM+Финтабло)"
if ! $PY rebuild_matrix.py --fresh; then
  echo ">>> процесс прибили — доделываю с чекпоинтов"
  for i in 1 2 3 4 5 6 7 8; do
    $PY rebuild_matrix.py && break
    echo ">>> resume $i…"
  done
fi
run "заливка P&L в Google Sheet" $PY push_to_gsheet.py

run "Касса (прогноз)" $PY cashflow.py
run "План-факт" $PY plan_fact.py

echo ">>> готово: $(date '+%Y-%m-%d %H:%M:%S')"
