#!/usr/bin/env bash
# Проверка КодИнвест на mini. Флаги: --sync (rsync дев→mini) --llm --tg
set -uo pipefail
MINI="cebers_mini@100.84.177.25"
SSH="ssh -p 2222 $MINI"
DEV="$HOME/Разработки/investpilot"
FAIL=0
note() { printf '%s\n' "$*"; }
check() { if [ "$1" -eq 0 ]; then note "✅ $2"; else note "❌ $2"; FAIL=1; fi; }

if [[ " $* " == *" --sync "* ]]; then
  rsync -az --delete -e "ssh -p 2222" --exclude .venv --exclude data --exclude logs \
    --exclude .git --exclude __pycache__ --exclude .pytest_cache --exclude .env \
    "$DEV/" "$MINI:Services/investpilot/"
  $SSH 'chmod +x ~/Services/investpilot/start.sh ~/Services/investpilot/scripts/*.sh && launchctl kickstart -k gui/$(id -u)/com.cebers.investpilot && sleep 10'
  check $? "sync + kickstart"
fi

ENVWRAP='cd ~/Services/investpilot && source ~/.codex/omniroute.env 2>/dev/null; set -a; source .env; set +a; export INVESTPILOT_OMNIROUTE_API_KEY="${OMNIROUTE_API_KEY:-}" INVESTPILOT_NVIDIA_API_KEY="${DELOR_IMAGE_API_KEY:-}"; PYTHONPATH=src'

$SSH "cd ~/Services/investpilot && .venv/bin/pytest -q" >/tmp/ip_pytest.log 2>&1
check $? "pytest на mini ($(grep -oE '[0-9]+ passed' /tmp/ip_pytest.log | head -1))"

$SSH "$ENVWRAP .venv/bin/python scripts/md_smoke.py" >/tmp/ip_smoke.log 2>&1
grep -q "ВСЕ ПРОВЕРКИ ПРОЙДЕНЫ" /tmp/ip_smoke.log; SM=$?
grep -q "ПРОВАЛОВ: 1" /tmp/ip_smoke.log && grep -q "❌ Brent" /tmp/ip_smoke.log && SM=0  # Brent None допустим
check $SM "md_smoke (ISS/ЦБ) $(tail -1 /tmp/ip_smoke.log)"

$SSH "$ENVWRAP .venv/bin/python scripts/analyze_once.py SBER --raw 2>/dev/null" >/tmp/ip_raw.log 2>&1
grep -q '"technicals"' /tmp/ip_raw.log && grep -q '"macro_rf"' /tmp/ip_raw.log
check $? "досье SBER (--raw): technicals+macro на месте"

KB=$($SSH 'sqlite3 ~/Services/investpilot/data/kb.db "SELECT COUNT(*)||\":\"||(SELECT COUNT(*) FROM kb_theses) FROM kb_documents"' 2>/dev/null)
[ -n "$KB" ] && [ "${KB%%:*}" -gt 0 ] && [ "${KB##*:}" -gt 0 ]
check $? "KB: документов:тезисов = $KB"

$SSH 'pgrep -f investpilot.bot.main >/dev/null'
check $? "процесс investpilot.bot.main жив"

# фоновое интрадей-обучение: детект сетапа на часовках работает
$SSH "$ENVWRAP .venv/bin/python -c \"
import asyncio, sys; sys.path.insert(0,'src')
from datetime import date, timedelta
from investpilot.marketdata.iss_client import IssClient
from investpilot.signals.intraday import detect_setup
async def m():
    async with IssClient() as iss:
        c = await iss.hourly_candles('SBER', frm=date.today()-timedelta(days=9))
    print('HOURLY', len(c))
    detect_setup(c, date.today())  # не должен падать
    print('INTRADAY_OK')
asyncio.run(m())\"" >/tmp/ip_intr.log 2>&1
grep -q INTRADAY_OK /tmp/ip_intr.log
check $? "интрадей-обучение: часовки+детект ($(grep -oE 'HOURLY [0-9]+' /tmp/ip_intr.log))"

TILE=$($SSH 'test -f /tmp/dash_status.py || cat > /tmp/dash_status.py << "PYEOF"
#!/usr/bin/env python3
import hashlib, hmac, time, urllib.request
SECRET = open("/Users/cebers_mini/Services/ops_dashboard/_state/session_secret.key").read().strip()
user, issued = "cebers", str(int(time.time()))
sig = hmac.new(SECRET.encode(), f"{user}|{issued}".encode(), hashlib.sha256).hexdigest()
req = urllib.request.Request("http://127.0.0.1:8787/api/status", headers={"Cookie": f"ops_dashboard_session={user}:{issued}:{sig}"})
print(urllib.request.urlopen(req, timeout=30).read().decode())
PYEOF
python3 /tmp/dash_status.py 2>/dev/null | python3 -c "
import json,sys
d=json.load(sys.stdin)
for s in d.get(\"services\") or []:
    if s.get(\"id\")==\"investpilot\": print(s.get(\"status\")); break"')
[ "$TILE" = "running" ]; check $? "тайл ops_dashboard: ${TILE:-нет ответа}"

# ERROR только за текущий запуск (после последнего «КодИнвест запущен») и без
# транзиентных сетевых обрывов polling — aiogram их авто-переподключает
ERRS=$($SSH 'L=~/Services/investpilot/logs/investpilot.log; \
  awk "/КодИнвест запущен/{buf=\"\"} {buf=buf\$0 ORS} END{printf \"%s\", buf}" "$L" 2>/dev/null \
  | grep " ERROR " | grep -vcE "TelegramNetworkError|Failed to fetch updates"')
[ "${ERRS:-0}" -eq 0 ]; check $? "ERROR в логе (текущий запуск): ${ERRS:-0}"

# локальный брокер-песочница: исполнитель жив + виртуальный портфель набран
$SSH 'grep -q "локальный брокер-песочница: активен" ~/Services/investpilot/logs/investpilot.log'
check $? "локальный брокер-песочница: активен (лог)"
$SSH 'cd ~/Services/investpilot && [ "$(sqlite3 data/investpilot.db "SELECT COUNT(*) FROM paper_positions WHERE qty>0")" -ge 1 ]'
check $? "paper-портфель набран (позиции в paper_positions)"

if [[ " $* " == *" --llm "* ]]; then
  note "--- LLM-прогон (смотри глазами):"
  $SSH "$ENVWRAP .venv/bin/python scripts/analyze_once.py SBER GLDRUB_TOM 2>/dev/null" | grep -vE "^INFO|^WARNING"
fi

if [[ " $* " == *" --tg "* ]]; then
  R=$($SSH 'source ~/Services/investpilot/.env 2>/dev/null; curl -s --max-time 20 --proxy http://127.0.0.1:2081 -X POST "https://api.telegram.org/bot${INVESTPILOT_BOT_TOKEN}/sendMessage" -d chat_id=1005954706 -d text="🔧 investpilot-e2e: проверка доставки" | head -c 20')
  [[ "$R" == *'"ok":true'* ]]; check $? "TG-доставка владельцу"
fi

note ""
[ $FAIL -eq 0 ] && note "=== ВСЁ ЗЕЛЕНО ===" || note "=== ЕСТЬ ПРОВАЛЫ ==="
exit $FAIL
