"""
Analyse détaillée de la stratégie V10
- Performance hebdomadaire sur le dernier mois
- Projection de profits réalistes
- Paramètres de la stratégie
"""

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import json
from strategies.inverse_strategy_v10 import InverseStrategyV10, InverseBacktesterV10
import requests

def get_binance_klines(symbol='BTCUSDT', interval='1m', days=30):
    """Récupère les données historiques depuis Binance"""
    url = "https://api.binance.com/api/v3/klines"

    end_time = int(datetime.now().timestamp() * 1000)
    start_time = int((datetime.now() - timedelta(days=days)).timestamp() * 1000)

    all_data = []
    current_start = start_time

    print(f"📥 Récupération {days} jours de données {symbol} (1m)...")

    while current_start < end_time:
        params = {
            'symbol': symbol,
            'interval': interval,
            'startTime': current_start,
            'limit': 1000
        }

        response = requests.get(url, params=params)
        data = response.json()

        if not data:
            break

        all_data.extend(data)
        current_start = data[-1][0] + 60000  # +1 minute

        print(f"   {len(all_data)} chandeliers récupérés...", end='\r')

    print(f"\n✅ {len(all_data)} chandeliers récupérés")

    # Convertir en DataFrame
    df = pd.DataFrame(all_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[['timestamp', 'open', 'high', 'low', 'close', 'volume']]


def backtest_weekly(df, initial_capital=1000):
    """Backtest semaine par semaine"""

    # Diviser en semaines
    df['week'] = df['timestamp'].dt.isocalendar().week
    df['year'] = df['timestamp'].dt.year

    weeks = df.groupby(['year', 'week'])

    results = []
    cumulative_capital = initial_capital

    print(f"\n{'='*80}")
    print(f"📊 BACKTEST HEBDOMADAIRE - Capital initial: ${initial_capital:,.0f}")
    print(f"{'='*80}\n")

    for (year, week), week_data in weeks:
        if len(week_data) < 500:  # Skip semaines incomplètes
            continue

        week_start = week_data['timestamp'].min()
        week_end = week_data['timestamp'].max()

        # Backtest sur cette semaine
        backtester = InverseBacktesterV10(initial_capital=cumulative_capital)
        result = backtester.backtest(week_data.reset_index(drop=True), 'BTCUSDT')

        if result:
            week_return = result['total_return']
            week_trades = len(result['trades'])
            week_wr = result['win_rate'] * 100

            new_capital = result['final_capital']
            profit = new_capital - cumulative_capital

            results.append({
                'year': year,
                'week': week,
                'start': week_start,
                'end': week_end,
                'trades': week_trades,
                'win_rate': week_wr,
                'return_pct': week_return,
                'profit_usd': profit,
                'capital_before': cumulative_capital,
                'capital_after': new_capital
            })

            # Afficher
            status = "✅" if week_return > 0 else "❌"
            print(f"{status} Semaine {week:02d}/{year} ({week_start.strftime('%d/%m')} - {week_end.strftime('%d/%m')})")
            print(f"   Trades: {week_trades:2d} | WR: {week_wr:5.1f}% | "
                  f"Return: {week_return:+7.2f}% | Profit: ${profit:+8.2f}")
            print(f"   Capital: ${cumulative_capital:,.2f} → ${new_capital:,.2f}")
            print()

            # Mettre à jour capital cumulatif
            cumulative_capital = new_capital

    return results, cumulative_capital


def analyze_strategy_params():
    """Analyse les paramètres de la stratégie V10"""

    print(f"\n{'='*80}")
    print(f"⚙️  PARAMÈTRES STRATÉGIE V10 INVERSE")
    print(f"{'='*80}\n")

    print("📋 PRINCIPE:")
    print("   • Détecte marchés en RANGE (faible volatilité)")
    print("   • INVERSE les signaux classiques (contrarian)")
    print("   • Utilise 3 stratégies: RSI, MACD, Bollinger")
    print()

    print("📊 DÉTECTION RANGE:")
    print("   • ATR < 0.3% (volatilité faible)")
    print("   • Touches répétées support/résistance (2+ de chaque)")
    print("   • Lookback: 100 chandeliers")
    print()

    print("⚡ LEVERAGE DYNAMIQUE:")
    print("   • Signal PARFAIT (score 1.0 + 4 confluences): 250x | Risk 3.0%")
    print("   • Signal EXCELLENT (score 1.0 OU 4 confluences): 225x | Risk 2.5%")
    print("   • Signal TRÈS BON (score 0.95+):                 200x | Risk 2.2%")
    print("   • Signal BON (score 0.90+):                      200x | Risk 2.0%")
    print()

    print("📈 PYRAMIDING:")
    print("   • Niveau 1: +0.5% profit → Ajouter 50% position initiale")
    print("   • Niveau 2: +1.0% profit → Ajouter 25% position initiale")
    print()

    print("🛡️  RISK MANAGEMENT:")
    print("   • Stop-Loss: 0.5% (250x) à 0.8% (100x)")
    print("   • Take-Profit: 3.5:1 ratio (R:R)")
    print("   • Trailing Stop: Active après +0.3%, trail à 0.15%")
    print()

    print("🎯 TRACKING PERFORMANCE:")
    print("   • Boost stratégies hot (WR ≥ 90%): +30% risk")
    print("   • Pénalité stratégies cold (WR ≤ 30%): -30% risk")
    print("   • Skip stratégies avec 2+ losses sans win")
    print()


def project_profits(initial_capital, weekly_results):
    """Projection de profits réaliste"""

    if not weekly_results:
        return

    print(f"\n{'='*80}")
    print(f"💰 PROJECTION PROFITS RÉALISTES")
    print(f"{'='*80}\n")

    # Calculer statistiques
    returns = [r['return_pct'] for r in weekly_results]
    avg_return_week = np.mean(returns)
    median_return_week = np.median(returns)
    std_return = np.std(returns)

    winning_weeks = [r for r in weekly_results if r['return_pct'] > 0]
    win_rate_weeks = len(winning_weeks) / len(weekly_results) * 100

    print(f"📊 STATISTIQUES HEBDOMADAIRES:")
    print(f"   Semaines testées: {len(weekly_results)}")
    print(f"   Semaines gagnantes: {len(winning_weeks)} ({win_rate_weeks:.1f}%)")
    print(f"   Return moyen: {avg_return_week:+.2f}% / semaine")
    print(f"   Return médian: {median_return_week:+.2f}% / semaine")
    print(f"   Volatilité: ±{std_return:.2f}%")
    print()

    # Projections
    print(f"📈 PROJECTIONS (Capital initial: ${initial_capital:,.2f}):")
    print()

    scenarios = [
        ("Conservative (Q1)", median_return_week * 0.5),
        ("Médian", median_return_week),
        ("Optimiste (Q3)", median_return_week * 1.5),
    ]

    periods = [
        ("1 semaine", 1),
        ("1 mois (4 semaines)", 4),
        ("3 mois (12 semaines)", 12),
        ("6 mois (26 semaines)", 26),
        ("1 an (52 semaines)", 52)
    ]

    for scenario_name, weekly_return in scenarios:
        print(f"🎯 Scénario {scenario_name} ({weekly_return:+.2f}%/semaine):")
        print()

        for period_name, weeks in periods:
            # Compound return
            final_capital = initial_capital * ((1 + weekly_return/100) ** weeks)
            total_profit = final_capital - initial_capital
            total_return = (final_capital / initial_capital - 1) * 100

            print(f"   {period_name:25s}: "
                  f"${final_capital:10,.2f} | "
                  f"Profit: ${total_profit:+9,.2f} ({total_return:+6.1f}%)")

        print()

    # Risk warning
    print(f"⚠️  DISCLAIMER:")
    print(f"   • Performances passées ≠ performances futures")
    print(f"   • High leverage = high risk")
    print(f"   • Toujours trader avec capital à risque uniquement")
    print(f"   • Drawdowns possibles même avec bonne stratégie")
    print()


if __name__ == '__main__':
    print("\n" + "="*80)
    print("📊 ANALYSE COMPLÈTE STRATÉGIE V10")
    print("="*80)

    # 1. Paramètres
    analyze_strategy_params()

    # 2. Récupérer données
    df = get_binance_klines(symbol='BTCUSDT', interval='1m', days=30)

    # 3. Backtest hebdomadaire
    weekly_results, final_capital = backtest_weekly(df, initial_capital=1000)

    # 4. Résumé
    if weekly_results:
        total_return = (final_capital / 1000 - 1) * 100

        print(f"{'='*80}")
        print(f"📈 RÉSUMÉ GLOBAL")
        print(f"{'='*80}")
        print(f"Capital initial:  $1,000.00")
        print(f"Capital final:    ${final_capital:,.2f}")
        print(f"Profit total:     ${final_capital - 1000:+,.2f}")
        print(f"Return total:     {total_return:+.2f}%")
        print(f"{'='*80}\n")

        # 5. Projections
        project_profits(57.50, weekly_results)  # Ton capital actuel

        # Sauvegarder résultats
        with open('backtest_weekly_analysis.json', 'w') as f:
            json.dump({
                'weekly_results': weekly_results,
                'final_capital': final_capital,
                'total_return': total_return
            }, f, indent=2, default=str)

        print("💾 Résultats sauvegardés: backtest_weekly_analysis.json")

    print("\n✅ Analyse terminée!")
