"""
PUSH THE LIMITS - Chercher au-delà de 32.38%
Tests avec SL ultra-serrés et variations agressives
"""
import pandas as pd
import numpy as np
from apollo_client import ApolloDegenClient

print('\n' + '='*100)
print('🔥 PUSH THE LIMITS - Objectif: Battre 32.38%')
print('='*100)

client = ApolloDegenClient()
df = client.get_klines('BTCUSDT', '1m', limit=1500)

# MA indicators
for period in [10, 15, 20, 25, 30]:
    df[f'ma_{period}'] = df['close'].rolling(period).mean()

def backtest(df, ma_period, sl_pct, tp_ratio, lev):
    capital = 1000
    trades = []

    ma_col = f'ma_{ma_period}'

    for i in range(ma_period + 10, len(df)-10, 5):
        if pd.isna(df.iloc[i][ma_col]):
            continue

        close = df.iloc[i]['close']
        ma = df.iloc[i][ma_col]

        # Simple trend
        side = 'LONG' if close > ma else 'SHORT'

        if side == 'LONG':
            sl = close * (1 - sl_pct)
            tp = close * (1 + sl_pct * tp_ratio)
        else:
            sl = close * (1 + sl_pct)
            tp = close * (1 - sl_pct * tp_ratio)

        # Exit check
        for j in range(i+1, min(i+15, len(df))):
            candle = df.iloc[j]
            exit_price = None

            if side == 'LONG':
                if candle['low'] <= sl:
                    exit_price = sl
                elif candle['high'] >= tp:
                    exit_price = tp
            else:
                if candle['high'] >= sl:
                    exit_price = sl
                elif candle['low'] <= tp:
                    exit_price = tp

            if exit_price:
                pnl_pct = ((exit_price - close) / close) if side == 'LONG' else ((close - exit_price) / close)
                pnl_usd = capital * 0.05 * lev * pnl_pct
                capital += pnl_usd
                trades.append(pnl_usd)
                break

    if len(trades) >= 50:
        total_return = ((capital - 1000) / 1000) * 100
        wins = len([t for t in trades if t > 0])
        wr = wins / len(trades) * 100
        return {
            'ma': ma_period,
            'sl': sl_pct,
            'tp': sl_pct * tp_ratio,
            'tp_ratio': tp_ratio,
            'lev': lev,
            'return': total_return,
            'wr': wr,
            'trades': len(trades),
            'capital': capital
        }
    return None

# Aggressive configs around the winner
test_configs = []

# Ultra tight SL with high TP ratios
for sl in [0.00020, 0.00022, 0.00025, 0.00028, 0.00030]:  # 0.020% - 0.030%
    for tp_ratio in [5, 6, 7, 8, 10]:
        for lev in [225, 250]:
            for ma in [10, 15, 20, 25, 30]:
                test_configs.append({
                    'ma': ma,
                    'sl': sl,
                    'tp_ratio': tp_ratio,
                    'lev': lev
                })

print(f'\n🔬 Testing {len(test_configs)} configurations...\n')
print('{:<6} | {:<8} | {:<8} | {:<8} | {:<6} | {:<10} | {:<7} | {:<8}'.format(
    'MA', 'SL%', 'TP%', 'Ratio', 'Lev', 'Return%', 'WR%', 'Trades'
))
print('-'*100)

results = []

for i, cfg in enumerate(test_configs):
    if i % 50 == 0:
        print(f'Progress: {i}/{len(test_configs)} ({i/len(test_configs)*100:.1f}%)')

    result = backtest(df, cfg['ma'], cfg['sl'], cfg['tp_ratio'], cfg['lev'])
    if result:
        results.append(result)

# Top 30
results.sort(key=lambda x: x['return'], reverse=True)

print('\n' + '='*100)
print('🏆 TOP 30 CONFIGURATIONS')
print('='*100)
print('{:<6} | {:<8} | {:<8} | {:<8} | {:<6} | {:<10} | {:<7} | {:<8}'.format(
    'MA', 'SL%', 'TP%', 'Ratio', 'Lev', 'Return%', 'WR%', 'Trades'
))
print('-'*100)

for r in results[:30]:
    print('{:<6} | {:<8.4f} | {:<8.3f} | {:<8.1f} | {:<6} | {:<10.2f} | {:<7.1f} | {:<8}'.format(
        r['ma'], r['sl']*100, r['tp']*100, r['tp_ratio'], r['lev'], r['return'], r['wr'], r['trades']
    ))

if results:
    best = results[0]

    print('\n' + '='*100)
    print('👑 ULTIMATE CHAMPION')
    print('='*100)
    print('MA Period: {}'.format(best['ma']))
    print('SL:        {:.4f}%'.format(best['sl']*100))
    print('TP:        {:.3f}% (ratio {:.1f}:1)'.format(best['tp']*100, best['tp_ratio']))
    print('Leverage:  {}x'.format(best['lev']))
    print('')
    print('Return:    {:+.2f}%'.format(best['return']))
    print('Win Rate:  {:.1f}%'.format(best['wr']))
    print('Trades:    {}'.format(best['trades']))
    print('Capital:   ${:.2f}'.format(best['capital']))
    print('')

    improvement = best['return'] - 32.38
    if improvement > 0:
        print('🚀 NOUVEAU RECORD ! +{:.2f}% vs précédent record'.format(improvement))
    else:
        print('⚠️  Pas mieux que 32.38%. Différence: {:.2f}%'.format(improvement))

    print('='*100)
