#!/usr/bin/env python3
"""
Script de test pour vérifier les nouveaux calculs de leverage
"""

import sys
import logging
from simple_trading_system.pragmatic_signals import PragmaticSignalGenerator
from hyperliquid_client import HyperliquidClient

# Configuration du logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def test_new_leverage_calculation():
    """Test les nouveaux calculs de leverage"""

    logger.info("=" * 60)
    logger.info("TEST NOUVEAUX CALCULS DE LEVERAGE")
    logger.info("=" * 60)

    try:
        # Initialiser le client et le générateur
        logger.info("\n1. Initialisation...")
        client = HyperliquidClient()
        signal_generator = PragmaticSignalGenerator(client, logger)

        # Test avec différents symboles et forces de signal
        test_cases = [
            {'symbol': 'BTC', 'strength': 0.9, 'volatility': 3.0},
            {'symbol': 'BTC', 'strength': 0.8, 'volatility': 5.0},
            {'symbol': 'BTC', 'strength': 0.7, 'volatility': 2.0},
            {'symbol': 'ETH', 'strength': 0.9, 'volatility': 4.0},
            {'symbol': 'ETH', 'strength': 0.7, 'volatility': 6.0},
            {'symbol': 'SOL', 'strength': 0.85, 'volatility': 7.0},
            {'symbol': 'BNB', 'strength': 0.75, 'volatility': 3.5},
            {'symbol': 'DOGE', 'strength': 0.8, 'volatility': 8.0},
            {'symbol': 'COMP', 'strength': 0.9, 'volatility': 2.5},
        ]

        logger.info("\n2. Test des calculs de leverage:")
        logger.info("Symbol | Max  | Force | Volatilité | Leverage | % du Max")
        logger.info("-" * 55)

        for case in test_cases:
            symbol = case['symbol']
            strength = case['strength']
            volatility = case['volatility']

            # Calculer le leverage
            leverage = signal_generator._calculate_smart_leverage(strength, volatility, symbol)

            # Récupérer le max disponible
            max_available = signal_generator.leverage_cache.get(symbol, 20)

            # Calculer le pourcentage utilisé
            percentage = (leverage / max_available) * 100

            logger.info(f"{symbol:6} | {max_available:2}x | {strength:.2f}  | {volatility:8.1f} | {leverage:6}x | {percentage:5.1f}%")

        # Test avec signaux réels
        logger.info("\n3. Test avec génération de signaux réels...")
        signals = signal_generator.generate_signals()

        if signals:
            logger.info(f"\n4. Signaux générés avec nouveaux leverages ({len(signals)} signaux):")
            logger.info("Symbol | Side  | Score | Leverage | Raison")
            logger.info("-" * 50)

            for signal in signals[:10]:  # Afficher les 10 premiers
                symbol = signal.get('symbol', 'N/A')
                side = signal.get('side', 'N/A')
                score = signal.get('quality_score', 0)
                leverage = signal.get('leverage', 0)
                reason = signal.get('reason', '')[:30] + '...' if len(signal.get('reason', '')) > 30 else signal.get('reason', '')

                logger.info(f"{symbol:6} | {side:5} | {score:.2f}  | {leverage:6}x | {reason}")

        # Comparer avec les anciens leverages
        logger.info("\n5. Comparaison avant/après:")
        logger.info("Exemple BTC signal fort (force 0.9, volatilité 3.0):")

        # Ancien calcul (fixe à 10x max)
        old_leverage = min(10, 7)  # Ancien max de 10x

        # Nouveau calcul
        new_leverage = signal_generator._calculate_smart_leverage(0.9, 3.0, 'BTC')

        logger.info(f"  Ancien système: {old_leverage}x")
        logger.info(f"  Nouveau système: {new_leverage}x")
        logger.info(f"  Amélioration: +{((new_leverage/old_leverage)-1)*100:.1f}%")

        logger.info("\n6. Vérifications de sécurité:")

        # Test avec volatilité extrême
        extreme_leverage = signal_generator._calculate_smart_leverage(0.95, 10.0, 'BTC')
        logger.info(f"  Signal très fort + volatilité extrême (10%): {extreme_leverage}x")

        # Test avec signal faible
        weak_leverage = signal_generator._calculate_smart_leverage(0.6, 2.0, 'BTC')
        logger.info(f"  Signal faible (0.6) + faible volatilité: {weak_leverage}x")

        logger.info("\n" + "=" * 60)
        logger.info("✅ TEST TERMINÉ - NOUVEAUX LEVERAGES OPÉRATIONNELS")
        logger.info("=" * 60)

    except Exception as e:
        logger.error(f"❌ Erreur lors du test: {e}", exc_info=True)

if __name__ == "__main__":
    test_new_leverage_calculation()