"""
Test de détection d'outliers en temps réel avec FreqAI
"""
import numpy as np
from freqai_integration import get_freqai_manager

def test_outlier_detection():
    print("="*70)
    print("🧪 TEST FREQAI - DÉTECTION D'OUTLIERS EN TEMPS RÉEL")
    print("="*70)
    
    # Initialiser FreqAI Manager
    manager = get_freqai_manager()
    if not manager:
        print("❌ FreqAI Manager non disponible")
        return
    
    print("\n✅ FreqAI Manager initialisé")
    
    # Test 1: Données normales (ne devrait PAS bloquer)
    print("\n" + "="*70)
    print("📊 TEST 1: Données normales")
    print("="*70)
    
    normal_prices = [100, 101, 99, 100.5, 99.5, 100.2, 100.8, 99.8, 100.3]
    normal_volumes = [1000, 1100, 950, 1050, 980, 1020, 1080, 990, 1030]
    
    should_block, analysis = manager.should_check_outliers(
        symbol="TESTUSDT",
        prices=normal_prices,
        volumes=normal_volumes,
        rsi=50.0,
        bb_position=0.5,
        block_on_outlier=True
    )
    
    print(f"   Symbol: TESTUSDT")
    print(f"   Prix: {normal_prices[-3:]}...")
    print(f"   Volumes: {normal_volumes[-3:]}...")
    print(f"   RSI: 50.0, BB Position: 0.5")
    print(f"\n   Résultat: {'🚫 BLOQUÉ' if should_block else '✅ AUTORISÉ'}")
    
    if analysis:
        print(f"   Méthode: {getattr(analysis, 'method', 'N/A')}")
        print(f"   Score: {getattr(analysis, 'score', 0):.2f}")
        print(f"   Raison: {getattr(analysis, 'reason', 'N/A')}")
    
    # Test 2: Volume spike massif (DEVRAIT bloquer)
    print("\n" + "="*70)
    print("📊 TEST 2: Volume spike massif (10x)")
    print("="*70)
    
    spike_prices = [100, 101, 99, 100.5, 99.5, 100.2, 100.8, 99.8, 105]  # +5% sudden
    spike_volumes = [1000, 1100, 950, 1050, 980, 1020, 1080, 990, 12000]  # 12x spike!
    
    should_block, analysis = manager.should_check_outliers(
        symbol="SPIKECOIN",
        prices=spike_prices,
        volumes=spike_volumes,
        rsi=65.0,
        bb_position=0.8,
        block_on_outlier=True
    )
    
    print(f"   Symbol: SPIKECOIN")
    print(f"   Prix: {spike_prices[-3:]}... (+{((spike_prices[-1]/spike_prices[-2]-1)*100):.1f}%)")
    print(f"   Volumes: {spike_volumes[-3:]}... ({spike_volumes[-1]/np.mean(spike_volumes[:-1]):.1f}x)")
    print(f"   RSI: 65.0, BB Position: 0.8")
    print(f"\n   Résultat: {'🚫 BLOQUÉ' if should_block else '✅ AUTORISÉ'}")
    
    if analysis:
        print(f"   Méthode: {getattr(analysis, 'method', 'N/A')}")
        print(f"   Score: {getattr(analysis, 'score', 0):.2f}")
        print(f"   Raison: {getattr(analysis, 'reason', 'N/A')}")
        details = getattr(analysis, 'details', None)
        if details:
            print(f"   Détails: {details}")
    
    # Test 3: Prix extrême (Z-Score élevé)
    print("\n" + "="*70)
    print("📊 TEST 3: Prix extrême (pump +20%)")
    print("="*70)
    
    pump_prices = [100, 101, 99, 100.5, 99.5, 100.2, 100.8, 99.8, 120]  # +20% pump!
    pump_volumes = [1000, 1100, 950, 1050, 980, 1020, 1080, 990, 3500]  # Volume 3.5x
    
    should_block, analysis = manager.should_check_outliers(
        symbol="PUMPCOIN",
        prices=pump_prices,
        volumes=pump_volumes,
        rsi=85.0,  # RSI très élevé
        bb_position=1.2,  # Au-dessus de la bande supérieure
        block_on_outlier=True
    )
    
    print(f"   Symbol: PUMPCOIN")
    print(f"   Prix: {pump_prices[-3:]}... (+{((pump_prices[-1]/pump_prices[-2]-1)*100):.1f}%)")
    print(f"   Volumes: {pump_volumes[-3:]}... ({pump_volumes[-1]/np.mean(pump_volumes[:-1]):.1f}x)")
    print(f"   RSI: 85.0, BB Position: 1.2")
    print(f"\n   Résultat: {'🚫 BLOQUÉ' if should_block else '✅ AUTORISÉ'}")
    
    if analysis:
        print(f"   Méthode: {getattr(analysis, 'method', 'N/A')}")
        print(f"   Score: {getattr(analysis, 'score', 0):.2f}")
        print(f"   Raison: {getattr(analysis, 'reason', 'N/A')}")
        details = getattr(analysis, 'details', None)
        if details:
            print(f"   Détails: {details}")
    
    # Test 4: Flash crash
    print("\n" + "="*70)
    print("📊 TEST 4: Flash crash (-15%)")
    print("="*70)
    
    crash_prices = [100, 101, 99, 100.5, 99.5, 100.2, 100.8, 99.8, 85]  # -15% crash!
    crash_volumes = [1000, 1100, 950, 1050, 980, 1020, 1080, 990, 8000]  # Volume 8x
    
    should_block, analysis = manager.should_check_outliers(
        symbol="CRASHCOIN",
        prices=crash_prices,
        volumes=crash_volumes,
        rsi=15.0,  # RSI très bas
        bb_position=-0.2,  # En dessous de la bande inférieure
        block_on_outlier=True
    )
    
    print(f"   Symbol: CRASHCOIN")
    print(f"   Prix: {crash_prices[-3:]}... ({((crash_prices[-1]/crash_prices[-2]-1)*100):.1f}%)")
    print(f"   Volumes: {crash_volumes[-3:]}... ({crash_volumes[-1]/np.mean(crash_volumes[:-1]):.1f}x)")
    print(f"   RSI: 15.0, BB Position: -0.2")
    print(f"\n   Résultat: {'🚫 BLOQUÉ' if should_block else '✅ AUTORISÉ'}")
    
    if analysis:
        print(f"   Méthode: {getattr(analysis, 'method', 'N/A')}")
        print(f"   Score: {getattr(analysis, 'score', 0):.2f}")
        print(f"   Raison: {getattr(analysis, 'reason', 'N/A')}")
        details = getattr(analysis, 'details', None)
        if details:
            print(f"   Détails: {details}")
    
    # Résumé
    print("\n" + "="*70)
    print("📊 RÉSUMÉ DES TESTS")
    print("="*70)
    print("""
✅ Test 1: Données normales → Devrait être AUTORISÉ
🚫 Test 2: Volume spike 12x → Devrait être BLOQUÉ
🚫 Test 3: Pump +20% → Devrait être BLOQUÉ
🚫 Test 4: Crash -15% → Devrait être BLOQUÉ

Le système FreqAI protège contre les anomalies de marché avant l'exécution des trades.
    """)

if __name__ == "__main__":
    test_outlier_detection()
