"""
Validateur IA - Efficacité détection CREUX_REBOUND
Analyse la performance du pattern CREUX_REBOUND et valide la qualité de la détection
"""

import json
import os
from datetime import datetime
from collections import defaultdict
import statistics

class CreuxReboundValidator:
    """Validateur de performance du pattern CREUX_REBOUND"""
    
    def __init__(self):
        self.script_dir = os.path.dirname(os.path.abspath(__file__))
        self.history_file = os.path.join(self.script_dir, 'trade_history.json')
        self.trades = []
        self.stats = {
            'total_trades': 0,
            'wins': 0,
            'losses': 0,
            'total_pnl': 0,
            'total_pnl_pct': 0,
            'avg_pnl_pct': 0,
            'win_rate': 0,
            'avg_duration_minutes': 0,
            'best_trade': None,
            'worst_trade': None,
            'quick_exits': 0,
            'take_profits': 0,
            'stop_losses': 0,
        }
    
    def load_trades(self):
        """Charge l'historique des trades"""
        if not os.path.exists(self.history_file):
            print("❌ Aucun historique de trades trouvé")
            return False
        
        with open(self.history_file, 'r', encoding='utf-8') as f:
            all_trades = json.load(f)
        
        # Filtrer uniquement les trades CREUX_REBOUND
        self.trades = [t for t in all_trades if t.get('pattern') in ['CREUX_REBOUND', 'CREUX_REBOUND_EARLY']]
        
        if not self.trades:
            print("⚠️  Aucun trade CREUX_REBOUND trouvé dans l'historique")
            return False
        
        print(f"✅ {len(self.trades)} trade(s) CREUX_REBOUND chargé(s)")
        return True
    
    def analyze_trades(self):
        """Analyse les performances des trades CREUX_REBOUND"""
        if not self.trades:
            return
        
        wins = []
        losses = []
        durations = []
        reasons_count = defaultdict(int)
        
        for trade in self.trades:
            pnl_pct = trade.get('pnl_pct', 0)
            pnl = trade.get('pnl', 0)
            reason = trade.get('reason', 'unknown')
            
            # Calculer durée
            try:
                entry_time = datetime.fromisoformat(trade['entry_time'])
                exit_time = datetime.fromisoformat(trade['exit_time'])
                duration_minutes = (exit_time - entry_time).total_seconds() / 60
                durations.append(duration_minutes)
            except:
                duration_minutes = 0
            
            # Compter raisons de sortie
            reasons_count[reason] += 1
            
            # Win/Loss
            if pnl_pct > 0:
                wins.append(trade)
                self.stats['wins'] += 1
            else:
                losses.append(trade)
                self.stats['losses'] += 1
            
            self.stats['total_pnl'] += pnl
            self.stats['total_pnl_pct'] += pnl_pct
        
        # Statistiques globales
        self.stats['total_trades'] = len(self.trades)
        self.stats['win_rate'] = (self.stats['wins'] / self.stats['total_trades'] * 100) if self.stats['total_trades'] > 0 else 0
        self.stats['avg_pnl_pct'] = self.stats['total_pnl_pct'] / self.stats['total_trades'] if self.stats['total_trades'] > 0 else 0
        self.stats['avg_duration_minutes'] = statistics.mean(durations) if durations else 0
        
        # Meilleur et pire trade
        if self.trades:
            self.stats['best_trade'] = max(self.trades, key=lambda x: x.get('pnl_pct', 0))
            self.stats['worst_trade'] = min(self.trades, key=lambda x: x.get('pnl_pct', 0))
        
        # Raisons de sortie
        self.stats['quick_exits'] = reasons_count.get('quick-exit', 0)
        self.stats['take_profits'] = reasons_count.get('take-profit', 0)
        self.stats['stop_losses'] = reasons_count.get('stop-loss', 0)
        
        return wins, losses, reasons_count
    
    def validate_detection_quality(self):
        """Valide la qualité de la détection CREUX_REBOUND"""
        print("\n" + "="*70)
        print("🔍 VALIDATION QUALITÉ DÉTECTION CREUX_REBOUND")
        print("="*70)
        
        # Critères de qualité d'un bon CREUX_REBOUND
        perfect_conditions = 0
        good_conditions = 0
        weak_conditions = 0
        
        for trade in self.trades:
            symbol = trade.get('symbol', 'UNKNOWN')
            pnl_pct = trade.get('pnl_pct', 0)
            duration = 0
            
            try:
                entry_time = datetime.fromisoformat(trade['entry_time'])
                exit_time = datetime.fromisoformat(trade['exit_time'])
                duration = (exit_time - entry_time).total_seconds() / 60
            except:
                pass
            
            # Scoring de la détection
            score = 0
            
            # ✅ Trade profitable
            if pnl_pct > 0:
                score += 3
            
            # ✅ Gain significatif (>1%)
            if pnl_pct > 1.0:
                score += 2
            
            # ✅ Take profit atteint (meilleure sortie)
            if trade.get('reason') == 'take-profit':
                score += 2
            
            # ✅ Durée raisonnable (pas trop court, pas trop long)
            if 5 <= duration <= 180:  # Entre 5 min et 3h
                score += 1
            
            # ❌ Perte
            if pnl_pct < 0:
                score -= 3
            
            # ❌ Stop loss (mauvaise détection)
            if trade.get('reason') == 'stop-loss':
                score -= 2
            
            # Classification
            if score >= 5:
                perfect_conditions += 1
            elif score >= 2:
                good_conditions += 1
            else:
                weak_conditions += 1
        
        total = len(self.trades)
        perfect_pct = (perfect_conditions / total * 100) if total > 0 else 0
        good_pct = (good_conditions / total * 100) if total > 0 else 0
        weak_pct = (weak_conditions / total * 100) if total > 0 else 0
        
        print(f"\n📊 QUALITÉ DES DÉTECTIONS:")
        print(f"   🌟 Excellentes: {perfect_conditions}/{total} ({perfect_pct:.1f}%)")
        print(f"   ✅ Bonnes:      {good_conditions}/{total} ({good_pct:.1f}%)")
        print(f"   ⚠️  Faibles:    {weak_conditions}/{total} ({weak_pct:.1f}%)")
        
        # Évaluation globale
        if perfect_pct >= 60:
            print(f"\n🎯 ÉVALUATION: EXCELLENT - Le pattern détecte très bien les creux!")
        elif perfect_pct + good_pct >= 70:
            print(f"\n✅ ÉVALUATION: BON - Le pattern fonctionne correctement")
        elif perfect_pct + good_pct >= 50:
            print(f"\n⚠️  ÉVALUATION: MOYEN - Amélioration possible sur les conditions")
        else:
            print(f"\n❌ ÉVALUATION: FAIBLE - Les conditions doivent être revues")
    
    def generate_report(self):
        """Génère un rapport détaillé"""
        wins, losses, reasons = self.analyze_trades()
        
        print("\n" + "="*70)
        print("📈 RAPPORT D'ANALYSE - PATTERN CREUX_REBOUND")
        print("="*70)
        
        print(f"\n📊 STATISTIQUES GLOBALES:")
        print(f"   Total trades:        {self.stats['total_trades']}")
        print(f"   Wins:                {self.stats['wins']} ({self.stats['win_rate']:.1f}%)")
        print(f"   Losses:              {self.stats['losses']}")
        print(f"   P&L Total:           {self.stats['total_pnl']:+.2f} USDT")
        print(f"   P&L Total %:         {self.stats['total_pnl_pct']:+.2f}%")
        print(f"   P&L Moyen:           {self.stats['avg_pnl_pct']:+.2f}%")
        print(f"   Durée moyenne:       {self.stats['avg_duration_minutes']:.0f} minutes")
        
        print(f"\n💰 RAISONS DE SORTIE:")
        print(f"   Take Profit:         {self.stats['take_profits']} ({self.stats['take_profits']/self.stats['total_trades']*100:.1f}%)")
        print(f"   Quick Exit:          {self.stats['quick_exits']} ({self.stats['quick_exits']/self.stats['total_trades']*100:.1f}%)")
        print(f"   Stop Loss:           {self.stats['stop_losses']} ({self.stats['stop_losses']/self.stats['total_trades']*100:.1f}%)")
        
        if self.stats['best_trade']:
            best = self.stats['best_trade']
            print(f"\n🏆 MEILLEUR TRADE:")
            print(f"   Symbol:    {best['symbol']}")
            print(f"   P&L:       {best['pnl_pct']:+.2f}%")
            print(f"   Sortie:    {best['reason']}")
            print(f"   Entrée:    {best['entry_time']}")
        
        if self.stats['worst_trade']:
            worst = self.stats['worst_trade']
            print(f"\n💔 PIRE TRADE:")
            print(f"   Symbol:    {worst['symbol']}")
            print(f"   P&L:       {worst['pnl_pct']:+.2f}%")
            print(f"   Sortie:    {worst['reason']}")
            print(f"   Entrée:    {worst['entry_time']}")
        
        # Validation qualité
        self.validate_detection_quality()
        
        # Recommandations
        print("\n" + "="*70)
        print("💡 RECOMMANDATIONS:")
        print("="*70)
        
        if self.stats['win_rate'] < 50:
            print("   ⚠️  Win rate < 50% - Renforcer conditions d'entrée (RSI, momentum)")
        
        if self.stats['stop_losses'] > self.stats['take_profits']:
            print("   ⚠️  Plus de stop-loss que de take-profit - Revoir SL/TP ou conditions")
        
        if self.stats['avg_pnl_pct'] < 0:
            print("   ❌ P&L moyen négatif - Pattern non rentable, révision nécessaire")
        elif self.stats['avg_pnl_pct'] > 0.5:
            print("   ✅ P&L moyen positif - Pattern rentable, continuer optimisation")
        
        if self.stats['avg_duration_minutes'] < 5:
            print("   ⚠️  Durée moyenne < 5min - Trades trop rapides, risque de faux signaux")
        elif self.stats['avg_duration_minutes'] > 180:
            print("   ⚠️  Durée moyenne > 3h - Positions trop longues, risque de retournement")
        
        print("\n" + "="*70)
    
    def run(self):
        """Exécute la validation complète"""
        print("\n🤖 VALIDATEUR IA - PATTERN CREUX_REBOUND")
        print("="*70)
        
        if not self.load_trades():
            print("\n⏸️  Validation impossible - Attendez quelques trades pour analyse")
            return
        
        self.generate_report()
        
        # Sauvegarder rapport
        report_file = os.path.join(self.script_dir, 'creux_rebound_validation.json')
        with open(report_file, 'w', encoding='utf-8') as f:
            json.dump({
                'timestamp': datetime.now().isoformat(),
                'stats': self.stats,
                'total_trades': len(self.trades)
            }, f, indent=2)
        
        print(f"\n📄 Rapport sauvegardé: creux_rebound_validation.json")
        print("="*70 + "\n")

if __name__ == '__main__':
    validator = CreuxReboundValidator()
    validator.run()
