"""
Test du système de trailing stop du ProfitTaker
"""

import sys
import os
sys.path.append('..')

from profit_taker import ProfitTaker
from hyperliquid_client import HyperliquidClient
import time

# Fix encoding for Windows console
sys.stdout.reconfigure(encoding='utf-8')

def simulate_position_with_trailing(profit_taker, symbol, current_pnl, peak_pnl):
    """Simule une position avec des valeurs spécifiques pour tester le trailing"""

    # Créer une position factice pour les tests
    fake_position = {
        'symbol': symbol,
        'side': 'LONG',
        'pnl_percent': current_pnl,
        'peak_pnl_percent': peak_pnl,
        'entry_price': 100.0,
        'current_price': 100.0 + current_pnl,
        'current_size': 1.0,
        'leverage': 10
    }

    # L'ajouter temporairement aux positions actives
    with profit_taker.lock:
        profit_taker.active_positions[f"{symbol}_LONG"] = fake_position

    return fake_position

def test_trailing_stop():
    """Test du trailing stop avec différents scenarios"""

    print("=== TEST TRAILING STOP PROFIT TAKER ===")

    # Initialiser le client Hyperliquid
    try:
        hyperliquid_client = HyperliquidClient()
        print("Client Hyperliquid initialise")
    except Exception as e:
        print(f"Erreur client Hyperliquid: {e}")
        return

    # Initialiser le ProfitTaker
    profit_taker = ProfitTaker(hyperliquid_client=hyperliquid_client)
    print("ProfitTaker initialise")

    print("\n--- Scénarios de test ---")

    # Scénario 1: Position pas assez profitable (pas de trailing)
    print("\n1. Position à +2% (pas de trailing car < 3%)")
    simulate_position_with_trailing(profit_taker, "TEST1", 2.0, 2.5)
    profit_taker.check_trailing_stop_conditions()

    # Scénario 2: Position en profit mais pas de drawdown suffisant
    print("\n2. Position à +5% avec peak à +6% (drawdown 1% < 3%)")
    simulate_position_with_trailing(profit_taker, "TEST2", 5.0, 6.0)
    profit_taker.check_trailing_stop_conditions()

    # Scénario 3: Position qui doit déclencher le trailing stop
    print("\n3. Position à +4% avec peak à +8% (drawdown 4% > 3%)")
    simulate_position_with_trailing(profit_taker, "TEST3", 4.0, 8.0)
    profit_taker.check_trailing_stop_conditions()

    # Scénario 4: Position juste à la limite
    print("\n4. Position à +5% avec peak à +8% (drawdown exactement 3%)")
    simulate_position_with_trailing(profit_taker, "TEST4", 5.0, 8.0)
    profit_taker.check_trailing_stop_conditions()

    # Nettoyer les positions de test
    with profit_taker.lock:
        profit_taker.active_positions.clear()

    # Afficher les vraies positions actuelles
    print("\n--- Positions réelles actuelles ---")
    profit_taker.update_active_positions()

    with profit_taker.lock:
        if profit_taker.active_positions:
            for key, pos in profit_taker.active_positions.items():
                symbol = pos['symbol']
                side = pos['side']
                current_pnl = pos['pnl_percent']
                peak_pnl = pos['peak_pnl_percent']

                # Vérifier si cette position déclencherait le trailing
                would_trigger = (
                    current_pnl >= 3.0 and
                    peak_pnl != float('-inf') and
                    peak_pnl >= 3.0 and
                    current_pnl <= (peak_pnl - 3.0)
                )

                status = "TRIGGER TRAILING" if would_trigger else "Safe"
                print(f"  {symbol} {side}: PnL={current_pnl:.2f}%, Peak={peak_pnl:.2f}% - {status}")
        else:
            print("  Aucune position active")

    print("\n=== TEST TERMINÉ ===")

if __name__ == "__main__":
    test_trailing_stop()