import asyncio
import aiohttp
import json
import time
import numpy as np  # Удобно для квантилей

# Конфигурация
SYMBOL = 'btcfdusd'
# Оставляем только сделки, чтобы не мусорить в канале
URL = f"wss://stream.binance.com:9443/stream?streams={SYMBOL}@aggTrade"
DURATION = 60 

async def main():
    latencies = []
    start_test = time.time()

    print(f"🚀 Запуск чистого замера для {SYMBOL.upper()} на {DURATION} сек...")

    async with aiohttp.ClientSession() as session:
        async with session.ws_connect(URL) as ws:
            while time.time() - start_test < DURATION:
                try:
                    msg = await asyncio.wait_for(ws.receive(), timeout=1.0)
                    if msg.type == aiohttp.WSMsgType.TEXT:
                        recv_ts = time.time()
                        data = json.loads(msg.data)['data']
                        
                        # Напрямую берем 'E', так как в aggTrade он есть всегда
                        lag = (recv_ts - (data['E'] / 1000.0)) * 1000
                        latencies.append(lag)
                except asyncio.TimeoutError:
                    continue

    if not latencies:
        print("Данные не получены.")
        return

    # Расчет метрик
    latencies.sort()
    arr = np.array(latencies)
    
    def get_range(percent):
        lower = (100 - percent) / 2
        upper = 100 - lower
        return np.percentile(arr, lower), np.percentile(arr, upper)

    r90 = get_range(90)
    r95 = get_range(95)
    r99 = get_range(99)

    print("\n" + "="*60)
    print(f"📊 СТАТИСТИКА ЗАДЕРЖЕК (Всего пакетов: {len(latencies)})")
    print("-" * 60)
    print(f"Минимум: {arr.min():.1f} ms | Среднее: {arr.mean():.1f} ms | Максимум: {arr.max():.1f} ms")
    print("-" * 60)
    print(f"Интерцинтильные размахи (где лежит X% данных):")
    print(f"✅ 90% данных:  {r90[0]:.1f} ms — {r90[1]:.1f} ms  (разброс {r90[1]-r90[0]:.1f} ms)")
    print(f"🔶 95% данных:  {r95[0]:.1f} ms — {r95[1]:.1f} ms  (разброс {r95[1]-r95[0]:.1f} ms)")
    print(f"🔴 99% данных:  {r99[0]:.1f} ms — {r99[1]:.1f} ms  (разброс {r99[1]-r99[0]:.1f} ms)")
    print("="*60)

if __name__ == "__main__":
    asyncio.run(main())
