#!/usr/bin/env python3
"""Debug: Pourquoi aucun signal n'est généré?"""

import pandas as pd
import numpy as np
import requests
from improved_probabilistic_strategy import ImprovedProbabilisticStrategy
from probabilistic_scalping_strategy import ProbabilisticScalpingStrategy

def get_bnb_data():
    url = "https://api.binance.com/api/v3/klines"
    params = {'symbol': 'BNBUSDT', 'interval': '1m', 'limit': 1000}
    response = requests.get(url, params=params, timeout=10)
    data = response.json()

    df = pd.DataFrame(data, columns=[
        'timestamp', 'open', 'high', 'low', 'close', 'volume',
        'close_time', 'quote_volume', 'trades', 'taker_buy_base',
        'taker_buy_quote', 'ignore'
    ])

    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    for col in ['open', 'high', 'low', 'close', 'volume']:
        df[col] = df[col].astype(float)

    return df


def main():
    print("=" * 80)
    print("🔍 DEBUG STRATÉGIE PROBABILISTE")
    print("=" * 80)

    df = get_bnb_data()
    print(f"\n📊 Données: {len(df)} bougies")
    print(f"   Prix: ${df['close'].iloc[0]:.2f} → ${df['close'].iloc[-1]:.2f}")

    # Test 1: Version originale (on sait qu'elle génère des trades)
    print("\n📊 TEST 1: Version ORIGINALE")
    strategy_orig = ProbabilisticScalpingStrategy(
        leverage=500,
        sl_pct=0.02,
        tp_pct=0.08,
        z_threshold=2.2,
        min_probability=0.60
    )

    signals_orig = 0
    for i in range(200, len(df)):
        window = df.iloc[:i+1]
        signal = strategy_orig.analyze('BNB', window)
        if signal:
            signals_orig += 1
            if signals_orig <= 3:
                print(f"\n  Signal #{signals_orig}:")
                print(f"    {signal.side} @ ${signal.entry_price:.2f}")
                print(f"    Prob: {signal.probability*100:.1f}%")
                print(f"    Confidence: {signal.confidence:.0f}")
                print(f"    Reason: {signal.reason}")

    print(f"\n  Total signaux: {signals_orig}")

    # Test 2: Version améliorée
    print("\n📊 TEST 2: Version AMÉLIORÉE")
    strategy_new = ImprovedProbabilisticStrategy(
        leverage=100,
        sl_pct=0.05,
        tp_pct=0.10,
        z_threshold=2.0,
        min_probability=0.55,
        trend_filter_enabled=True,
        calibration_factor=0.60
    )

    signals_new = 0
    blocked_by_trend = 0
    blocked_by_validation = 0

    for i in range(200, len(df)):
        window = df.iloc[:i+1]

        # Analyser manuellement
        current_price = window['close'].iloc[-1]
        stats = strategy_new._calculate_statistics(window)
        trend = strategy_new._detect_trend(window)
        z_score = (current_price - stats['mean']) / stats['std']

        # Check si Z-score déclenche
        if abs(z_score) > strategy_new.z_threshold:
            # Test sans filtre de tendance d'abord
            side = 'LONG' if z_score < 0 else 'SHORT'

            # Check filtre de tendance
            if strategy_new.trend_filter_enabled:
                if side == 'LONG' and trend == 'STRONG_DOWN':
                    blocked_by_trend += 1
                    continue
                elif side == 'SHORT' and trend == 'STRONG_UP':
                    blocked_by_trend += 1
                    continue

            # Générer signal
            signal = strategy_new.analyze('BNB', window)

            if signal:
                signals_new += 1
                if signals_new <= 3:
                    print(f"\n  Signal #{signals_new}:")
                    print(f"    {signal.side} @ ${signal.entry_price:.2f}")
                    print(f"    Prob (calibrée): {signal.probability*100:.1f}%")
                    print(f"    Confidence: {signal.confidence:.0f}")
                    print(f"    Trend: {signal.trend_filter}")
                    print(f"    Reason: {signal.reason}")
            else:
                blocked_by_validation += 1

    print(f"\n  Total signaux: {signals_new}")
    print(f"  Bloqués par tendance: {blocked_by_trend}")
    print(f"  Bloqués par validation: {blocked_by_validation}")

    # Test 3: Version améliorée SANS filtre de tendance
    print("\n📊 TEST 3: Version AMÉLIORÉE SANS FILTRE TENDANCE")
    strategy_no_filter = ImprovedProbabilisticStrategy(
        leverage=100,
        sl_pct=0.05,
        tp_pct=0.10,
        z_threshold=2.0,
        min_probability=0.55,
        trend_filter_enabled=False,  # OFF
        calibration_factor=0.60
    )

    signals_no_filter = 0
    for i in range(200, len(df)):
        window = df.iloc[:i+1]
        signal = strategy_no_filter.analyze('BNB', window)
        if signal:
            signals_no_filter += 1
            if signals_no_filter <= 3:
                print(f"\n  Signal #{signals_no_filter}:")
                print(f"    {signal.side} @ ${signal.entry_price:.2f}")
                print(f"    Prob: {signal.probability*100:.1f}%")

    print(f"\n  Total signaux: {signals_no_filter}")

    # Test 4: Paramètres plus relâchés
    print("\n📊 TEST 4: Paramètres RELÂCHÉS")
    strategy_loose = ImprovedProbabilisticStrategy(
        leverage=100,
        sl_pct=0.05,
        tp_pct=0.10,
        z_threshold=1.5,  # Plus bas
        min_probability=0.50,  # Plus bas
        min_ev=0.15,  # Plus bas
        trend_filter_enabled=False,
        calibration_factor=0.60
    )

    signals_loose = 0
    for i in range(200, len(df)):
        window = df.iloc[:i+1]
        signal = strategy_loose.analyze('BNB', window)
        if signal:
            signals_loose += 1

    print(f"  Total signaux: {signals_loose}")

    # Résumé
    print("\n" + "=" * 80)
    print("📊 RÉSUMÉ")
    print("=" * 80)
    print(f"  Originale (Z>2.2, P>60%):         {signals_orig} signaux")
    print(f"  Améliorée (Z>2.0, P>55%, filter): {signals_new} signaux")
    print(f"  Améliorée SANS filter:             {signals_no_filter} signaux")
    print(f"  Paramètres relâchés (Z>1.5):       {signals_loose} signaux")

    print("\n💡 CONCLUSION:")
    if signals_new == 0 and signals_no_filter == 0:
        print("  ⚠️  Problème: La CALIBRATION bloque les signaux!")
        print("  → Probabilités calibrées trop basses (<55%)")
        print("  → Solution: Réduire min_probability ou calibration_factor")
    elif signals_new == 0 and signals_no_filter > 0:
        print("  ⚠️  Problème: Le FILTRE DE TENDANCE bloque tout!")
        print("  → Toutes les opportunités sont contre-tendance")
    elif signals_loose > signals_orig:
        print("  ✅ Solution: Réduire Z-threshold à 1.5-1.8")


if __name__ == '__main__':
    main()
