"""
Optimisation des SL/TP via modification du config
Teste différentes valeurs de STOP_LOSS_PCT et TAKE_PROFIT_RATIO
"""

import logging
import pandas as pd
import numpy as np
from apollo_client import ApolloDegenClient
from strategies.inverse_strategy_v10 import InverseBacktesterV10
import config

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

# Désactiver logs verbeux
logging.getLogger('InverseStrategyV10').setLevel(logging.WARNING)
logging.getLogger('ShortTermSignalGenerator').setLevel(logging.WARNING)
logging.getLogger('ApolloDegenClient').setLevel(logging.WARNING)
logging.getLogger('RegimeDetector').setLevel(logging.WARNING)

logger.info("🎯 OPTIMISATION SL/TP VIA CONFIG\n")
logger.info("="*80)

# Récupérer données
client = ApolloDegenClient()
df = client.get_klines('BTCUSDT', '1m', limit=1500)

logger.info(f"Données: {len(df)} chandeliers BTC 1m\n")

# V10 détermine leverage dynamiquement selon qualité signal (100x-250x)
# On teste différentes configs SL/TP

# Valeurs à tester
sl_values = [0.002, 0.0025, 0.003, 0.0035, 0.004, 0.005]  # 0.2% à 0.5%
tp_ratios = [2.0, 2.5, 3.0, 3.5, 4.0]  # Ratios reward:risk

results = []
best_result = None
best_config = None

total_tests = len(sl_values) * len(tp_ratios)
current_test = 0

logger.info(f"Tests à effectuer: {total_tests}\n")
logger.info("SL%    | TP Ratio | Return% | WR%  | Trades | PF   ")
logger.info("-" * 70)

for sl_pct in sl_values:
    for tp_ratio in tp_ratios:
        current_test += 1

        try:
            # Modifier config temporairement
            original_sl = config.STOP_LOSS_PCT[250]
            original_tp_ratio = config.TAKE_PROFIT_RATIO

            config.STOP_LOSS_PCT[250] = sl_pct
            config.TAKE_PROFIT_RATIO = tp_ratio

            # Run backtest (V10 détermine leverage dynamiquement)
            backtester = InverseBacktesterV10(initial_capital=1000)
            result = backtester.backtest(df, 'BTCUSDT')

            # Restaurer config
            config.STOP_LOSS_PCT[250] = original_sl
            config.TAKE_PROFIT_RATIO = original_tp_ratio

            if result and result['total_return'] > 0:
                # Calculer profit factor
                winning = [t for t in result['trades'] if t['pnl_usd'] > 0]
                losing = [t for t in result['trades'] if t['pnl_usd'] <= 0]

                total_wins = sum(t['pnl_usd'] for t in winning) if winning else 0
                total_losses = abs(sum(t['pnl_usd'] for t in losing)) if losing else 1
                profit_factor = total_wins / total_losses if total_losses > 0 else 0

                logger.info(
                    f"{sl_pct*100:5.2f}% | {tp_ratio:8.1f} | "
                    f"{result['total_return']:7.2f}% | {result['win_rate']*100:4.0f}% | "
                    f"{len(result['trades']):6} | {profit_factor:4.2f}"
                )

                result['sl_pct'] = sl_pct
                result['tp_ratio'] = tp_ratio
                result['profit_factor'] = profit_factor
                results.append(result)

                if best_result is None or result['total_return'] > best_result['total_return']:
                    best_result = result
                    best_config = {'sl_pct': sl_pct, 'tp_ratio': tp_ratio}

        except Exception as e:
            logger.error(f"Erreur SL={sl_pct*100:.2f}% TP={tp_ratio}: {e}")

# Résultats
if results:
    logger.info(f"\n\n{'='*80}")
    logger.info("📊 TOP 10 CONFIGURATIONS")
    logger.info(f"{'='*80}\n")

    sorted_results = sorted(results, key=lambda x: x['total_return'], reverse=True)[:10]

    logger.info(f"{'Rank':<5} {'SL%':<7} {'TP/SL':<7} {'Return%':<10} {'WR%':<7} {'PF':<7} {'Trades':<7}")
    logger.info("-" * 70)

    for i, r in enumerate(sorted_results, 1):
        logger.info(
            f"{i:<5} {r['sl_pct']*100:<7.2f} {r['tp_ratio']:<7.1f} "
            f"{r['total_return']:<10.2f} {r['win_rate']*100:<7.0f} "
            f"{r['profit_factor']:<7.2f} {len(r['trades']):<7}"
        )

if best_result:
    logger.info(f"\n\n{'='*80}")
    logger.info("🏆 MEILLEURE CONFIGURATION")
    logger.info(f"{'='*80}")
    logger.info(f"Strategy:      InverseStrategyV10 (leverage dynamique 100x-250x)")
    logger.info(f"Stop-Loss:     {best_config['sl_pct']*100:.2f}%")
    logger.info(f"TP/SL Ratio:   {best_config['tp_ratio']:.1f}:1")
    logger.info(f"Take-Profit:   {best_config['sl_pct']*100*best_config['tp_ratio']:.2f}%")
    logger.info(f"")
    logger.info(f"Return:        {best_result['total_return']:+.2f}%")
    logger.info(f"Win Rate:      {best_result['win_rate']*100:.1f}%")
    logger.info(f"Profit Factor: {best_result['profit_factor']:.2f}")
    logger.info(f"Total Trades:  {len(best_result['trades'])}")

    winning = [t for t in best_result['trades'] if t['pnl_usd'] > 0]
    losing = [t for t in best_result['trades'] if t['pnl_usd'] <= 0]

    if winning:
        avg_win = np.mean([t['pnl_pct'] for t in winning])
        logger.info(f"Avg Win:       {avg_win:+.2f}%")

    if losing:
        avg_loss = np.mean([t['pnl_pct'] for t in losing])
        logger.info(f"Avg Loss:      {avg_loss:+.2f}%")

    logger.info(f"{'='*80}\n")

    logger.info("💡 Pour appliquer cette config, modifier config.py:")
    logger.info(f"   STOP_LOSS_PCT[250] = {best_config['sl_pct']}")
    logger.info(f"   TAKE_PROFIT_RATIO = {best_config['tp_ratio']}")

else:
    logger.warning("Aucune configuration profitable trouvée")
