#!/usr/bin/env python3
"""
TEST COMPLET SL/TP - Vérifie tout le flux
"""

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# Simuler des candles BTC
def create_test_candles():
    """Crée des candles de test"""
    dates = pd.date_range(end=datetime.now(), periods=300, freq='5min')

    # Prix autour de 107,600
    prices = 107600 + np.random.randn(300) * 500

    df = pd.DataFrame({
        'timestamp': dates,
        'open': prices,
        'high': prices + np.random.rand(300) * 100,
        'low': prices - np.random.rand(300) * 100,
        'close': prices + np.random.randn(300) * 50,
        'volume': np.random.rand(300) * 1000000
    })

    return df

def test_v10_range_strategy():
    """Test V10 Range Strategy SL/TP"""
    from v10_range_strategy import V10RangeStrategy

    print("\n" + "="*80)
    print("🧪 TEST V10 RANGE STRATEGY")
    print("="*80)

    strategy = V10RangeStrategy(leverage=250)
    df = create_test_candles()

    signal = strategy.analyze('BTC', df)

    if signal:
        entry = signal['entry_price']
        sl = signal['stop_loss']
        tp = signal['take_profit']
        side = signal['side']

        print(f"\n✅ Signal généré:")
        print(f"   Side: {side}")
        print(f"   Entry: ${entry:.2f}")
        print(f"   SL: ${sl:.2f}")
        print(f"   TP: ${tp:.2f}")

        # Vérifications
        issues = []

        if side == 'LONG':
            if sl >= entry:
                issues.append(f"❌ LONG SL (${sl:.2f}) >= Entry (${entry:.2f})")
            if tp <= entry:
                issues.append(f"❌ LONG TP (${tp:.2f}) <= Entry (${entry:.2f})")
        else:  # SHORT
            if sl <= entry:
                issues.append(f"❌ SHORT SL (${sl:.2f}) <= Entry (${entry:.2f})")
            if tp >= entry:
                issues.append(f"❌ SHORT TP (${tp:.2f}) >= Entry (${entry:.2f})")

        if tp == entry:
            issues.append(f"🚨 TP == Entry (${tp:.2f}) - CRITIQUE !")
        if sl == entry:
            issues.append(f"🚨 SL == Entry (${sl:.2f}) - CRITIQUE !")

        if issues:
            print("\n🚨 PROBLÈMES DÉTECTÉS:")
            for issue in issues:
                print(f"   {issue}")
            return False
        else:
            print("\n✅ SL/TP corrects")
            return True
    else:
        print("\n⚠️  Aucun signal généré")
        return True

def test_bull_strategy():
    """Test Bull Strategy SL/TP"""
    from bull_strategy import BullStrategy

    print("\n" + "="*80)
    print("🧪 TEST BULL STRATEGY")
    print("="*80)

    strategy = BullStrategy(leverage=175)
    df = create_test_candles()

    # Forcer des conditions bull
    df['close'] = df['close'] * 1.01  # Prix en hausse

    signal = strategy.analyze('BTC', df)

    if signal:
        entry = signal.entry_price
        sl = signal.stop_loss
        tp = signal.take_profit

        print(f"\n✅ Signal généré:")
        print(f"   Side: LONG (Bull)")
        print(f"   Entry: ${entry:.2f}")
        print(f"   SL: ${sl:.2f}")
        print(f"   TP: ${tp:.2f}")

        issues = []

        if sl >= entry:
            issues.append(f"❌ LONG SL (${sl:.2f}) >= Entry (${entry:.2f})")
        if tp <= entry:
            issues.append(f"❌ LONG TP (${tp:.2f}) <= Entry (${entry:.2f})")
        if tp == entry:
            issues.append(f"🚨 TP == Entry - CRITIQUE !")
        if sl == entry:
            issues.append(f"🚨 SL == Entry - CRITIQUE !")

        if issues:
            print("\n🚨 PROBLÈMES DÉTECTÉS:")
            for issue in issues:
                print(f"   {issue}")
            return False
        else:
            print("\n✅ SL/TP corrects")
            return True
    else:
        print("\n⚠️  Aucun signal généré")
        return True

def test_bear_strategy():
    """Test Bear Strategy SL/TP"""
    from bear_strategy import BearStrategy

    print("\n" + "="*80)
    print("🧪 TEST BEAR STRATEGY")
    print("="*80)

    strategy = BearStrategy(leverage=150)
    df = create_test_candles()

    # Forcer des conditions bear
    df['close'] = df['close'] * 0.99  # Prix en baisse

    signal = strategy.analyze('BTC', df)

    if signal:
        entry = signal.entry_price
        sl = signal.stop_loss
        tp = signal.take_profit

        print(f"\n✅ Signal généré:")
        print(f"   Side: SHORT (Bear)")
        print(f"   Entry: ${entry:.2f}")
        print(f"   SL: ${sl:.2f}")
        print(f"   TP: ${tp:.2f}")

        issues = []

        # SHORT: SL doit être AU-DESSUS, TP EN-DESSOUS
        if sl <= entry:
            issues.append(f"❌ SHORT SL (${sl:.2f}) <= Entry (${entry:.2f})")
        if tp >= entry:
            issues.append(f"❌ SHORT TP (${tp:.2f}) >= Entry (${entry:.2f})")
        if tp == entry:
            issues.append(f"🚨 TP == Entry - CRITIQUE !")
        if sl == entry:
            issues.append(f"🚨 SL == Entry - CRITIQUE !")

        if issues:
            print("\n🚨 PROBLÈMES DÉTECTÉS:")
            for issue in issues:
                print(f"   {issue}")
            return False
        else:
            print("\n✅ SL/TP corrects")
            return True
    else:
        print("\n⚠️  Aucun signal généré")
        return True

def test_degen_scalping():
    """Test Degen Scalping Strategy SL/TP"""
    from degen_scalping_strategy import DegenScalpingStrategy

    print("\n" + "="*80)
    print("🧪 TEST DEGEN SCALPING STRATEGY")
    print("="*80)

    strategy = DegenScalpingStrategy(leverage=225)
    df = create_test_candles()

    signal = strategy.analyze('BTC', df)

    if signal:
        entry = signal.entry_price
        sl = signal.stop_loss
        tp = signal.take_profit
        side = signal.side

        print(f"\n✅ Signal généré:")
        print(f"   Side: {side}")
        print(f"   Entry: ${entry:.2f}")
        print(f"   SL: ${sl:.2f}")
        print(f"   TP: ${tp:.2f}")

        issues = []

        if side == 'LONG':
            if sl >= entry:
                issues.append(f"❌ LONG SL (${sl:.2f}) >= Entry (${entry:.2f})")
            if tp <= entry:
                issues.append(f"❌ LONG TP (${tp:.2f}) <= Entry (${entry:.2f})")
        else:  # SHORT
            if sl <= entry:
                issues.append(f"❌ SHORT SL (${sl:.2f}) <= Entry (${entry:.2f})")
            if tp >= entry:
                issues.append(f"❌ SHORT TP (${tp:.2f}) >= Entry (${entry:.2f})")

        if tp == entry:
            issues.append(f"🚨 TP == Entry (${tp:.2f}) - CRITIQUE !")
        if sl == entry:
            issues.append(f"🚨 SL == Entry (${sl:.2f}) - CRITIQUE !")

        if issues:
            print("\n🚨 PROBLÈMES DÉTECTÉS:")
            for issue in issues:
                print(f"   {issue}")
            return False
        else:
            print("\n✅ SL/TP corrects")
            return True
    else:
        print("\n⚠️  Aucun signal généré")
        return True

if __name__ == '__main__':
    print("="*80)
    print("🔬 TEST COMPLET SL/TP - TOUTES LES STRATÉGIES")
    print("="*80)

    results = {
        'V10 Range': test_v10_range_strategy(),
        'Bull': test_bull_strategy(),
        'Bear': test_bear_strategy(),
        'Degen Scalping': test_degen_scalping()
    }

    print("\n" + "="*80)
    print("📊 RÉSUMÉ FINAL")
    print("="*80)

    all_passed = all(results.values())

    for name, passed in results.items():
        status = "✅ PASS" if passed else "❌ FAIL"
        print(f"   {status} - {name}")

    print()
    if all_passed:
        print("✅ TOUS LES TESTS PASSENT")
    else:
        print("🚨 CERTAINS TESTS ÉCHOUENT - CORRECTION NÉCESSAIRE")

    print("="*80)
