#!/usr/bin/env python3
"""
Script de diagnostic automatique pour le web monitor
Teste tous les endpoints et identifie les bugs
"""

import requests
import json
from datetime import datetime

BASE_URL = "http://localhost:8889"

def test_endpoint(name, endpoint, expected_keys=None):
    """Teste un endpoint et vérifie qu'il fonctionne"""
    print(f"\n{'='*60}")
    print(f"🧪 Test: {name}")
    print(f"{'='*60}")
    
    try:
        url = f"{BASE_URL}{endpoint}"
        print(f"📡 GET {url}")
        
        response = requests.get(url, timeout=10)
        print(f"   Status: {response.status_code}")
        
        if response.status_code != 200:
            print(f"   ❌ ERREUR: Status code {response.status_code}")
            return False
        
        data = response.json()
        print(f"   ✅ Response JSON valide")
        
        # Vérifier les clés attendues
        if expected_keys:
            missing_keys = []
            for key in expected_keys:
                if key not in data:
                    missing_keys.append(key)
            
            if missing_keys:
                print(f"   ❌ Clés manquantes: {missing_keys}")
                return False
            else:
                print(f"   ✅ Toutes les clés présentes")
        
        # Afficher le contenu
        print(f"\n📊 Contenu:")
        print(json.dumps(data, indent=2)[:500])
        
        return True, data
        
    except requests.exceptions.Timeout:
        print(f"   ❌ TIMEOUT: Pas de réponse après 10s")
        return False, None
    except requests.exceptions.ConnectionError:
        print(f"   ❌ CONNECTION ERROR: Serveur inaccessible")
        return False, None
    except json.JSONDecodeError as e:
        print(f"   ❌ JSON ERROR: {e}")
        print(f"   Raw response: {response.text[:200]}")
        return False, None
    except Exception as e:
        print(f"   ❌ ERROR: {e}")
        return False, None


def analyze_results():
    """Analyse complète de tous les endpoints"""
    print("\n" + "="*60)
    print("🔍 DIAGNOSTIC WEB MONITOR - APOLLO DEGEN BOT")
    print("="*60)
    print(f"⏰ {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    results = {}
    
    # Test 1: Page principale
    print(f"\n📄 Test de la page principale...")
    try:
        response = requests.get(BASE_URL, timeout=10)
        if response.status_code == 200:
            print(f"   ✅ Page accessible")
            results['page'] = True
        else:
            print(f"   ❌ Page inaccessible (status: {response.status_code})")
            results['page'] = False
    except:
        print(f"   ❌ Serveur ne répond pas")
        results['page'] = False
    
    # Test 2: Status endpoint
    success, data = test_endpoint(
        "Status API", 
        "/api/status",
        ['bot_running', 'timestamp', 'wallet', 'stats', 'positions']
    )
    results['status'] = success
    
    if success and data:
        print(f"\n   📊 Analyse des stats:")
        stats = data.get('stats', {})
        print(f"      Total trades: {stats.get('total_trades', 0)}")
        print(f"      Wins: {stats.get('wins', 0)}")
        print(f"      Losses: {stats.get('losses', 0)}")
        print(f"      Win rate: {stats.get('win_rate', 0)}%")
        print(f"      Total PnL: ${stats.get('total_pnl', 0):.2f}")
        
        if stats.get('total_trades', 0) == 0:
            print(f"      ⚠️  WARNING: Aucun trade détecté!")
        
        wallet = data.get('wallet', {})
        print(f"\n   💰 Wallet:")
        print(f"      BNB: {wallet.get('bnb', 0)}")
        print(f"      USDT: {wallet.get('usdt', 0)}")
        print(f"      Address: {wallet.get('address', 'N/A')}")
    
    # Test 3: Positions ouvertes
    success, data = test_endpoint(
        "Positions ouvertes",
        "/api/positions/open",
        ['open_positions', 'count', 'timestamp']
    )
    results['positions_open'] = success
    
    if success and data:
        count = data.get('count', 0)
        print(f"\n   📦 Positions ouvertes: {count}")
        if count == 0:
            print(f"      ℹ️  Normal si toutes les positions sont fermées")
    
    # Test 4: Positions fermées
    success, data = test_endpoint(
        "Positions fermées",
        "/api/positions/closed",
        ['closed_positions', 'count', 'timestamp']
    )
    results['positions_closed'] = success
    
    if success and data:
        count = data.get('count', 0)
        print(f"\n   📦 Positions fermées: {count}")
        if count == 0:
            print(f"      ⚠️  WARNING: Aucune position fermée!")
    
    # Test 5: Toutes les positions
    success, data = test_endpoint(
        "Toutes les positions",
        "/api/positions",
        ['positions', 'stats', 'timestamp']
    )
    results['positions_all'] = success
    
    if success and data:
        stats = data.get('stats', {})
        print(f"\n   📊 Stats complètes:")
        print(f"      Total positions: {len(data.get('positions', []))}")
        print(f"      Closed: {stats.get('closed_positions', 0)}")
        print(f"      Winning: {stats.get('winning_trades', 0)}")
        print(f"      Losing: {stats.get('losing_trades', 0)}")
        print(f"      Win rate: {stats.get('win_rate', 0):.1f}%")
        print(f"      Total PnL: ${stats.get('total_pnl', 0):.2f}")
    
    # Test 6: Logs
    success, data = test_endpoint(
        "Logs",
        "/api/logs",
        ['logs']
    )
    results['logs'] = success
    
    if success and data:
        logs = data.get('logs', [])
        print(f"\n   📝 Logs: {len(logs)} lignes")
        if len(logs) == 0:
            print(f"      ⚠️  WARNING: Aucun log!")
        else:
            print(f"      Dernières lignes:")
            for line in logs[-3:]:
                print(f"         {line.strip()}")
    
    # Test 7: Market data
    success, data = test_endpoint(
        "Market Data",
        "/api/market_data",
        ['regime', 'current_price', 'candles']
    )
    results['market_data'] = success
    
    if success and data:
        print(f"\n   📈 Market:")
        print(f"      Regime: {data.get('regime', 'UNKNOWN')}")
        print(f"      BTC Price: ${data.get('current_price', 0):,.2f}")
        print(f"      Change 1h: {data.get('change_1h', 0):+.2f}%")
        print(f"      Candles: {len(data.get('candles', []))}")
    
    # Résumé
    print(f"\n{'='*60}")
    print(f"📋 RÉSUMÉ DES TESTS")
    print(f"{'='*60}")
    
    total = len(results)
    passed = sum(1 for v in results.values() if v)
    
    for test, success in results.items():
        status = "✅" if success else "❌"
        print(f"   {status} {test}")
    
    print(f"\n   Score: {passed}/{total} tests passés")
    
    # Identification des bugs
    print(f"\n{'='*60}")
    print(f"🐛 BUGS IDENTIFIÉS")
    print(f"{'='*60}")
    
    bugs = []
    
    # Vérifier si les stats sont vides dans /api/status
    if results.get('status'):
        try:
            response = requests.get(f"{BASE_URL}/api/status", timeout=10)
            data = response.json()
            stats = data.get('stats', {})
            
            if stats.get('total_trades', 0) == 0:
                bugs.append("❌ BUG 1: Widget Stats vide - /api/status retourne total_trades=0")
            else:
                print(f"   ✅ Stats OK: {stats.get('total_trades')} trades")
        except:
            pass
    
    # Vérifier si les positions fermées existent
    if results.get('positions_closed'):
        try:
            response = requests.get(f"{BASE_URL}/api/positions/closed", timeout=10)
            data = response.json()
            
            if data.get('count', 0) == 0:
                bugs.append("❌ BUG 2: Aucune position fermée détectée")
            else:
                print(f"   ✅ Positions fermées OK: {data.get('count')} positions")
        except:
            pass
    
    # Vérifier les logs
    if results.get('logs'):
        try:
            response = requests.get(f"{BASE_URL}/api/logs", timeout=10)
            data = response.json()
            
            if len(data.get('logs', [])) == 0:
                bugs.append("❌ BUG 3: Logs vides - /api/logs ne retourne aucun log")
            else:
                print(f"   ✅ Logs OK: {len(data.get('logs', []))} lignes")
        except:
            pass
    
    if not bugs:
        print(f"   ✅ Aucun bug identifié!")
    else:
        for bug in bugs:
            print(f"   {bug}")
    
    print(f"\n{'='*60}")
    print(f"✅ Diagnostic terminé")
    print(f"{'='*60}\n")


if __name__ == '__main__':
    analyze_results()
