#!/usr/bin/env python3
"""
Script pour tester le nouveau système de position sizing
"""

from hyperliquid_client import HyperliquidClient
import logging
import trading_config

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def test_new_sizing():
    """Test le nouveau système de sizing"""

    logger.info("=== TEST NOUVEAU SYSTÈME DE SIZING ===")

    client = HyperliquidClient()

    # Récupérer la balance
    account_state = client.get_account_state()
    if account_state and 'marginSummary' in account_state:
        account_value = float(account_state['marginSummary'].get('accountValue', 0))
        logger.info(f"Balance actuelle: ${account_value:.2f}")
    else:
        logger.error("Impossible de récupérer la balance")
        return

    # Configuration actuelle
    logger.info(f"\n=== CONFIGURATION ===")
    logger.info(f"USE_FIXED_POSITION_SIZE: {trading_config.USE_FIXED_POSITION_SIZE}")
    logger.info(f"FIXED_POSITION_SIZE_USD: {trading_config.FIXED_POSITION_SIZE_USD}")
    logger.info(f"MIN_POSITION_SIZE_USD: {trading_config.MIN_POSITION_SIZE_USD}")
    logger.info(f"MAX_SIMULTANEOUS_POSITIONS: {trading_config.MAX_SIMULTANEOUS_POSITIONS}")

    # Calculs avec le nouveau système
    max_positions = trading_config.MAX_SIMULTANEOUS_POSITIONS

    if trading_config.USE_FIXED_POSITION_SIZE:
        if trading_config.FIXED_POSITION_SIZE_USD is None:
            # Calcul automatique
            calculated_size = account_value / max_positions
            final_size = max(calculated_size, trading_config.MIN_POSITION_SIZE_USD)

            logger.info(f"\n=== CALCUL AUTOMATIQUE ===")
            logger.info(f"Taille calculée: ${calculated_size:.2f} (balance / {max_positions} positions)")
            logger.info(f"Taille finale: ${final_size:.2f} (après minimum)")
        else:
            # Taille fixe configurée
            final_size = max(trading_config.FIXED_POSITION_SIZE_USD, trading_config.MIN_POSITION_SIZE_USD)
            logger.info(f"\n=== TAILLE FIXE CONFIGURÉE ===")
            logger.info(f"Taille configurée: ${trading_config.FIXED_POSITION_SIZE_USD:.2f}")
            logger.info(f"Taille finale: ${final_size:.2f} (après minimum)")
    else:
        # Ancien système en %
        final_size = account_value * (trading_config.POSITION_SIZE_PERCENT / 100)
        logger.info(f"\n=== ANCIEN SYSTÈME (%) ===")
        logger.info(f"Taille: ${final_size:.2f} ({trading_config.POSITION_SIZE_PERCENT}% de ${account_value:.2f})")

    # Comparaison avec l'ancien système
    old_system_size = account_value * 0.10  # 10%

    logger.info(f"\n=== COMPARAISON ===")
    logger.info(f"Ancien système (10%): ${old_system_size:.2f}")
    logger.info(f"Nouveau système: ${final_size:.2f}")

    if final_size > old_system_size:
        improvement = ((final_size / old_system_size) - 1) * 100
        logger.info(f"Amélioration: +{improvement:.1f}%")
    elif final_size < old_system_size:
        reduction = ((old_system_size / final_size) - 1) * 100
        logger.info(f"Réduction: -{reduction:.1f}%")
    else:
        logger.info("Aucun changement")

    # Impact sur le capital
    total_exposure = final_size * max_positions
    capital_usage = (total_exposure / account_value) * 100

    logger.info(f"\n=== IMPACT CAPITAL ===")
    logger.info(f"Exposition totale max: ${total_exposure:.2f}")
    logger.info(f"Usage du capital: {capital_usage:.1f}%")

    # Simulation avec différents leverages
    logger.info(f"\n=== SIMULATION LEVERAGES ===")
    for leverage in [3, 5, 10, 15, 20]:
        notional = final_size * leverage
        margin_needed = final_size  # Margin = position_value / leverage
        logger.info(f"Leverage {leverage:2}x: Notionnel ${notional:8.2f} | Marge ${margin_needed:.2f}")

if __name__ == "__main__":
    test_new_sizing()