#!/usr/bin/env python3
"""
ANALYSE DES RÉSULTATS D'OPTIMISATION MASSIVE
Compile tous les fichiers et trouve les meilleures configs
"""

import json
import os
from datetime import datetime
from collections import defaultdict
import sys

class MassiveResultsAnalyzer:
    def __init__(self, results_dir='optimization_results_massive'):
        self.results_dir = results_dir
        self.all_results = []
        self.profitable = []
        self.stats_by_leverage = defaultdict(lambda: {'total': 0, 'profitable': 0, 'best_pnl': -float('inf')})

    def load_all_results(self):
        """Charge tous les fichiers de résultats"""
        print(f"📂 Lecture des résultats depuis: {self.results_dir}/")

        if not os.path.exists(self.results_dir):
            print(f"❌ Dossier non trouvé: {self.results_dir}")
            return

        files = [f for f in os.listdir(self.results_dir) if f.endswith('.json')]
        print(f"📄 {len(files)} fichiers trouvés\n")

        for filename in files:
            try:
                with open(os.path.join(self.results_dir, filename)) as f:
                    result = json.load(f)
                    self.all_results.append(result)

                    # Stats
                    lev = result['params']['leverage']
                    pnl = result['results']['total_pnl_pct']
                    pf = result['results']['profit_factor']

                    self.stats_by_leverage[lev]['total'] += 1

                    if pnl > 0 and pf > 1.0:
                        self.profitable.append(result)
                        self.stats_by_leverage[lev]['profitable'] += 1

                        if pnl > self.stats_by_leverage[lev]['best_pnl']:
                            self.stats_by_leverage[lev]['best_pnl'] = pnl

            except Exception as e:
                print(f"⚠️  Erreur lecture {filename}: {e}")

        print(f"✅ {len(self.all_results)} configurations testées")
        print(f"✅ {len(self.profitable)} configurations profitables ({len(self.profitable)/len(self.all_results)*100:.1f}%)\n")

    def print_summary(self):
        """Affiche le résumé global"""
        print("="*100)
        print("📊 RÉSUMÉ GLOBAL - OPTIMISATION MASSIVE")
        print("="*100)
        print(f"Tests totaux: {len(self.all_results)}")
        print(f"Profitables: {len(self.profitable)} ({len(self.profitable)/len(self.all_results)*100:.1f}%)")
        print("="*100)

    def print_stats_by_leverage(self):
        """Stats par leverage"""
        print("\n📈 STATISTIQUES PAR LEVERAGE")
        print("="*100)

        for lev in sorted(self.stats_by_leverage.keys()):
            stats = self.stats_by_leverage[lev]
            total = stats['total']
            profitable = stats['profitable']
            rate = profitable / total * 100 if total > 0 else 0
            best_pnl = stats['best_pnl'] if stats['best_pnl'] > -float('inf') else 0

            print(f"{lev:3}x | Tests: {total:4} | Profitables: {profitable:3} ({rate:5.1f}%) | Meilleur PnL: {best_pnl:+7.1f}%")

        print("="*100)

    def print_top_configs(self, n=50):
        """Affiche les TOP N configs"""
        if not self.profitable:
            print("\n❌ Aucune configuration profitable trouvée!")
            return

        print(f"\n🏆 TOP {n} CONFIGURATIONS PROFITABLES")
        print("="*100)

        # Trier par PnL décroissant
        top = sorted(self.profitable, key=lambda x: x['results']['total_pnl_pct'], reverse=True)[:n]

        for idx, result in enumerate(top, 1):
            params = result['params']
            res = result['results']

            print(f"\n#{idx}. PnL: {res['total_pnl_pct']:+6.1f}% | "
                  f"PF: {res['profit_factor']:5.2f} | "
                  f"WR: {res['win_rate']:5.1f}% | "
                  f"Trades: {res['total_trades']:3}")

            print(f"    Leverage: {params['leverage']:3}x | "
                  f"SL: {params['sl_atr_mult']:4.2f}x ATR | "
                  f"TP: {params['tp_atr_mult']:4.2f}x ATR | "
                  f"Ratio: {params['tp_atr_mult']/params['sl_atr_mult']:4.1f}:1")

            print(f"    Min Conf: {params['min_confidence']:2}% | "
                  f"Position: {params['position_pct']:2}% | "
                  f"Final: ${res['final_capital']:7.2f}")

            print(f"    Avg Win: ${res['avg_win']:6.2f} | "
                  f"Avg Loss: ${res['avg_loss']:7.2f}")

        print("="*100)

    def save_report(self, filename='massive_optimization_report.txt'):
        """Sauvegarde un rapport complet"""
        with open(filename, 'w') as f:
            f.write(f"RAPPORT D'OPTIMISATION MASSIVE\n")
            f.write(f"Généré le: {datetime.now()}\n")
            f.write("="*100 + "\n\n")

            f.write(f"RÉSUMÉ:\n")
            f.write(f"  Tests totaux: {len(self.all_results)}\n")
            f.write(f"  Profitables: {len(self.profitable)} ({len(self.profitable)/len(self.all_results)*100:.1f}%)\n\n")

            f.write("STATS PAR LEVERAGE:\n")
            for lev in sorted(self.stats_by_leverage.keys()):
                stats = self.stats_by_leverage[lev]
                total = stats['total']
                profitable = stats['profitable']
                rate = profitable / total * 100 if total > 0 else 0
                best_pnl = stats['best_pnl'] if stats['best_pnl'] > -float('inf') else 0

                f.write(f"  {lev:3}x | Tests: {total:4} | Profitables: {profitable:3} ({rate:5.1f}%) | Meilleur: {best_pnl:+7.1f}%\n")

            f.write("\n" + "="*100 + "\n")
            f.write("TOP 50 CONFIGURATIONS\n")
            f.write("="*100 + "\n\n")

            top = sorted(self.profitable, key=lambda x: x['results']['total_pnl_pct'], reverse=True)[:50]

            for idx, result in enumerate(top, 1):
                params = result['params']
                res = result['results']

                f.write(f"#{idx}. PnL: {res['total_pnl_pct']:+6.1f}% | PF: {res['profit_factor']:5.2f} | WR: {res['win_rate']:5.1f}% | Trades: {res['total_trades']:3}\n")
                f.write(f"    Leverage: {params['leverage']:3}x | SL: {params['sl_atr_mult']:4.2f}x ATR | TP: {params['tp_atr_mult']:4.2f}x ATR | Ratio: {params['tp_atr_mult']/params['sl_atr_mult']:4.1f}:1\n")
                f.write(f"    Min Conf: {params['min_confidence']:2}% | Position: {params['position_pct']:2}% | Final: ${res['final_capital']:7.2f}\n\n")

        print(f"\n💾 Rapport sauvegardé: {filename}")

    def run(self):
        """Execute l'analyse complète"""
        self.load_all_results()

        if len(self.all_results) == 0:
            print("❌ Aucun résultat à analyser!")
            return

        self.print_summary()
        self.print_stats_by_leverage()
        self.print_top_configs(n=50)
        self.save_report()


if __name__ == '__main__':
    analyzer = MassiveResultsAnalyzer()
    analyzer.run()
