"""
Test FreqAI avec données réelles du bot
"""
import numpy as np
from freqai_integration import get_freqai_manager

def test_with_realistic_data():
    print("="*70)
    print("🧪 TEST FREQAI - DONNÉES RÉALISTES")
    print("="*70)
    
    manager = get_freqai_manager()
    if not manager:
        print("❌ FreqAI Manager non disponible")
        return
    
    print("\n✅ FreqAI Manager initialisé\n")
    
    # Générer 50 points de données normales
    base_price = 100
    normal_prices = []
    normal_volumes = []
    
    np.random.seed(42)
    for i in range(50):
        # Prix avec mouvement brownien (volatilité 1%)
        change = np.random.normal(0, 0.01)
        base_price = base_price * (1 + change)
        normal_prices.append(base_price)
        
        # Volume normal autour de 1000 ±20%
        volume = 1000 * (1 + np.random.normal(0, 0.2))
        normal_volumes.append(volume)
    
    # Test 1: Données normales avec historique suffisant
    print("="*70)
    print("📊 TEST 1: 50 points normaux")
    print("="*70)
    
    should_block, analysis = manager.should_check_outliers(
        symbol="NORMALCOIN",
        prices=normal_prices,
        volumes=normal_volumes,
        rsi=52.0,
        bb_position=0.55,
        block_on_outlier=True
    )
    
    print(f"   Prix moyen: {np.mean(normal_prices):.2f}")
    print(f"   Prix écart-type: {np.std(normal_prices):.2f}")
    print(f"   Volume moyen: {np.mean(normal_volumes):.0f}")
    print(f"   Derniers prix: {normal_prices[-3:]}")
    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 énorme
    print("\n" + "="*70)
    print("📊 TEST 2: 49 points normaux + 1 VOLUME SPIKE (15x)")
    print("="*70)
    
    spike_volumes = normal_volumes.copy()
    spike_volumes[-1] = spike_volumes[-1] * 15  # 15x volume!
    
    should_block, analysis = manager.should_check_outliers(
        symbol="VOLUMESPIKE",
        prices=normal_prices,
        volumes=spike_volumes,
        rsi=68.0,
        bb_position=0.75,
        block_on_outlier=True
    )
    
    print(f"   Volume normal: {np.mean(spike_volumes[:-1]):.0f}")
    print(f"   Volume actuel: {spike_volumes[-1]:.0f}")
    print(f"   Ratio: {spike_volumes[-1]/np.mean(spike_volumes[:-1]):.1f}x")
    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: PUMP massif
    print("\n" + "="*70)
    print("📊 TEST 3: 49 points normaux + PUMP +25%")
    print("="*70)
    
    pump_prices = normal_prices.copy()
    pump_prices[-1] = pump_prices[-2] * 1.25  # +25% en une bougie!
    
    pump_volumes = normal_volumes.copy()
    pump_volumes[-1] = pump_volumes[-1] * 6  # 6x volume
    
    should_block, analysis = manager.should_check_outliers(
        symbol="PUMPCOIN",
        prices=pump_prices,
        volumes=pump_volumes,
        rsi=88.0,
        bb_position=1.3,
        block_on_outlier=True
    )
    
    print(f"   Prix précédent: {pump_prices[-2]:.2f}")
    print(f"   Prix actuel: {pump_prices[-1]:.2f}")
    print(f"   Variation: +{((pump_prices[-1]/pump_prices[-2]-1)*100):.1f}%")
    print(f"   Volume: {pump_volumes[-1]/np.mean(pump_volumes[:-1]):.1f}x")
    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: CRASH
    print("\n" + "="*70)
    print("📊 TEST 4: 49 points normaux + CRASH -20%")
    print("="*70)
    
    crash_prices = normal_prices.copy()
    crash_prices[-1] = crash_prices[-2] * 0.80  # -20% en une bougie!
    
    crash_volumes = normal_volumes.copy()
    crash_volumes[-1] = crash_volumes[-1] * 10  # 10x volume
    
    should_block, analysis = manager.should_check_outliers(
        symbol="CRASHCOIN",
        prices=crash_prices,
        volumes=crash_volumes,
        rsi=12.0,
        bb_position=-0.3,
        block_on_outlier=True
    )
    
    print(f"   Prix précédent: {crash_prices[-2]:.2f}")
    print(f"   Prix actuel: {crash_prices[-1]:.2f}")
    print(f"   Variation: {((crash_prices[-1]/crash_prices[-2]-1)*100):.1f}%")
    print(f"   Volume: {crash_volumes[-1]/np.mean(crash_volumes[:-1]):.1f}x")
    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É")
    print("="*70)
    print("""
Le système FreqAI a besoin d'au moins 30 points de données pour détecter les outliers.

✅ FONCTIONNALITÉS ACTIVES:
   • Isolation Forest (sklearn)
   • Z-Score sur prix et volumes
   • Détection volume spike (>5x)
   • Détection flash crash
   • Détection pump & dump

🎯 PROTECTION EN TEMPS RÉEL:
   Le bot accumule les données de chaque symbole.
   Dès 30+ points, FreqAI bloque automatiquement les trades suspects.
    """)

if __name__ == "__main__":
    test_with_realistic_data()
