#!/usr/bin/env bash
set -euo pipefail

SCRIPT_VERSION="collect_pre_live_validation_v1_2026_05_03"
echo "[script_version] $0 SCRIPT_VERSION=${SCRIPT_VERSION}"

# ═══════════════════════════════════════════════════════════════════
# Pre-live validation data collector
# Вирішує 4 критичних проблеми перед деплоєм BIO/USDC стратегії:
#   1. Поточний pool_L (вирішальний сигнал входу/не входу)
#   2. Feb-Mar bearish backtest (BIO впав -65%, треба перевірити)
#   3. SYND/USDC 30-денний збір (другий кандидат ~1063% annual)
#   4. BIO/USDC May current (оновлені дані після зміни pool_L)
# ═══════════════════════════════════════════════════════════════════

BASE_RPC_URL="${BASE_RPC_URL:-https://mainnet.base.org}"
THEGRAPH_KEY="${THEGRAPH_KEY:-}"   # optional, прискорює Feb-Mar збір
SLEEP_S="${SLEEP_S:-0.15}"
EVENTS="${EVENTS:-Swap}"
CHUNK="${CHUNK:-3000}"

COLLECTOR="dex_platform/data_collectors/fetch_aerodrome_slipstream_events_v2.py"
NPZ_BUILDER="dex_platform/data_collectors/build_cl_fee_replay_npz_v2.py"

BIO_USDC="0xd40bffa9c9e35493b88a2b6744c49d8716b00898"
SYND_USDC="0x9dcbb8258e0015d6cb81061b3f5c47d5c5d6188f"

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "КРОК 0: Поточний pool_L (мілісекундне рішення входу)"
echo "═══════════════════════════════════════════════════════════════"
python3 - << 'PYEOF'
from web3 import Web3
import sys

w3 = Web3(Web3.HTTPProvider("https://mainnet.base.org"))
pool_addr = Web3.to_checksum_address("0xd40bffa9c9e35493b88a2b6744c49d8716b00898")

try:
    result = w3.eth.call({'to': pool_addr, 'data': '0x1a686502'})
    pool_L = int.from_bytes(result[:16], 'big')
    threshold_enter  = 3e18
    threshold_good   = 1.5e18
    threshold_great  = 9e17

    print(f"pool_L зараз: {pool_L:.3e}")
    print(f"  Квітень W1 (low vol):  2.78e18")
    print(f"  Квітень W3 (best):     8.49e17  ← ідеал")
    print(f"  Поріг ВХОДУ:         < 3.0e18")
    print()

    if pool_L < threshold_great:
        print("СИГНАЛ: EXCELLENT - умови схожі на Apr W3 (найкраще)")
        print(f"  Очікуваний annual: ~700-1300%")
        sys.exit(0)
    elif pool_L < threshold_good:
        print("СИГНАЛ: GOOD - умови прийнятні")
        print(f"  Очікуваний annual: ~400-700%")
        sys.exit(0)
    elif pool_L < threshold_enter:
        print("СИГНАЛ: MARGINAL - входити обережно, дохідність знижена")
        print(f"  Очікуваний annual: ~200-400%")
        sys.exit(0)
    else:
        print("СИГНАЛ: СТОП - pool_L занадто висока, НЕ ВХОДИТИ")
        print(f"  При pool_L > 3e18 дохідність < 150% (нижче цілі)")
        sys.exit(1)
except Exception as e:
    print(f"Помилка перевірки: {e}")
    print("Продовжую збір даних...")
PYEOF
POOL_L_OK=$?

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "КРОК 1: BIO/USDC Feb-Mar 2026 (bearish backtest)"
echo "  BIO впав -65% у лютому-березні → треба перевірити MDD"
echo "═══════════════════════════════════════════════════════════════"
OUT_BEARISH="DEX_DATA/aerodrome_slipstream/bio_usdc_feb_mar_bearish"
mkdir -p "$OUT_BEARISH"

if [ -f "${OUT_BEARISH}/events_all.csv" ]; then
    echo "[skip] ${OUT_BEARISH}/events_all.csv вже існує"
else
    echo "[collect] BIO/USDC Feb 1 - Apr 1 2026..."
    python3 "${COLLECTOR}" \
      --pool "${BIO_USDC}" \
      --time-from "2026-02-01T00:00:00Z" \
      --time-to   "2026-04-01T00:00:00Z" \
      --out-dir   "${OUT_BEARISH}" \
      --rpc-url   "${BASE_RPC_URL}" \
      --chunk-size "${CHUNK}" \
      --min-chunk-size 100 \
      --sleep-s "${SLEEP_S}" \
      --attempts 8 \
      --events "${EVENTS}" \
      --no-parquet
fi

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "КРОК 2: BIO/USDC May 2026 (поточна картина після Apr)"
echo "  Потрібно знати чи pool_L і volume збереглись після квітня"
echo "═══════════════════════════════════════════════════════════════"
OUT_MAY="DEX_DATA/aerodrome_slipstream/bio_usdc_may2026"
mkdir -p "$OUT_MAY"

if [ -f "${OUT_MAY}/events_all.csv" ]; then
    echo "[skip] May дані вже є"
else
    echo "[collect] BIO/USDC May 1-3 2026..."
    python3 "${COLLECTOR}" \
      --pool "${BIO_USDC}" \
      --time-from "2026-05-01T00:00:00Z" \
      --time-to   "2026-05-04T00:00:00Z" \
      --out-dir   "${OUT_MAY}" \
      --rpc-url   "${BASE_RPC_URL}" \
      --chunk-size "${CHUNK}" \
      --min-chunk-size 100 \
      --sleep-s "${SLEEP_S}" \
      --attempts 6 \
      --events "${EVENTS}" \
      --no-parquet
fi

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "КРОК 3: SYND/USDC повний квітень (другий кандидат ~1063% ann)"
echo "  pool_L=5.6e17 + fee=0.95% → потрібна повна місячна валідація"
echo "═══════════════════════════════════════════════════════════════"
OUT_SYND="DEX_DATA/aerodrome_slipstream/synd_usdc_apr_full"
mkdir -p "$OUT_SYND"

if [ -f "${OUT_SYND}/events_all.csv" ]; then
    echo "[skip] SYND квітень вже є"
else
    echo "[collect] SYND/USDC Apr 1 - May 3 2026..."
    python3 "${COLLECTOR}" \
      --pool "${SYND_USDC}" \
      --time-from "2026-04-01T00:00:00Z" \
      --time-to   "2026-05-03T00:00:00Z" \
      --out-dir   "${OUT_SYND}" \
      --rpc-url   "${BASE_RPC_URL}" \
      --chunk-size "${CHUNK}" \
      --min-chunk-size 100 \
      --sleep-s "${SLEEP_S}" \
      --attempts 6 \
      --events "${EVENTS}" \
      --no-parquet
fi

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "КРОК 4: Зведений статус"
echo "═══════════════════════════════════════════════════════════════"
python3 - << 'PYEOF'
import os

pools = [
    ("BIO/USDC Feb-Mar (bearish)", "DEX_DATA/aerodrome_slipstream/bio_usdc_feb_mar_bearish"),
    ("BIO/USDC May (current)", "DEX_DATA/aerodrome_slipstream/bio_usdc_may2026"),
    ("SYND/USDC Apr (full)", "DEX_DATA/aerodrome_slipstream/synd_usdc_apr_full"),
]

print("\nСтатус зібраних даних:")
all_ok = True
for name, path in pools:
    raw = f"{path}/events.raw.jsonl"
    csv = f"{path}/events_all.csv"
    if os.path.exists(csv):
        n = sum(1 for _ in open(csv)) - 1
        print(f"  {name}: ГОТОВО ({n} рядків) ✓")
    elif os.path.exists(raw):
        n = sum(1 for _ in open(raw))
        print(f"  {name}: RAW є ({n} подій), CSV не згенеровано")
        all_ok = False
    else:
        print(f"  {name}: НЕМАЄ ✗")
        all_ok = False

print()
if all_ok:
    print("Всі дані зібрані! Запусти backtest:")
    print("  python3 dex_platform/backtest/run_pre_live_backtests.py")
else:
    print("Деякі дані ще збираються або не вдалось зібрати.")
    print("Перезапусти скрипт або check логи.")
PYEOF

echo ""
echo "[done] collect_pre_live_validation_v1 finished"
