#!/usr/bin/env python3
"""Script pour corriger les trades avec P&L = 0 en récupérant les vrais prix de vente"""

import json
import os
from datetime import datetime
import urllib.request
import time

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
history_file = os.path.join(SCRIPT_DIR, 'trade_history.json')

# Charger l'historique
with open(history_file, 'r', encoding='utf-8') as f:
    history = json.load(f)

print(f"📊 Chargé {len(history)} trades")

# Trouver les trades à corriger
trades_to_fix = []
for i, trade in enumerate(history):
    if trade.get('reason') == 'manual_sell_all' and trade.get('pnl', 0) == 0:
        trades_to_fix.append((i, trade))

print(f"🔧 {len(trades_to_fix)} trades à corriger")

if not trades_to_fix:
    print("✅ Aucune correction nécessaire")
    exit(0)

# Pour chaque trade, récupérer le prix au moment de la vente
fixed_count = 0
failed_count = 0

for idx, trade in trades_to_fix:
    symbol = trade['symbol']
    entry_price = trade['entry_price']
    exit_time = trade['exit_time']
    quantity = trade['quantity']
    
    print(f"\n🔍 Correction de {symbol} (vendu le {exit_time})")
    
    # Convertir exit_time en timestamp
    try:
        exit_dt = datetime.fromisoformat(exit_time.replace('Z', '+00:00'))
        exit_timestamp = int(exit_dt.timestamp() * 1000)
    except:
        print(f"  ❌ Impossible de parser la date: {exit_time}")
        failed_count += 1
        continue
    
    # Récupérer la bougie la plus proche du moment de la vente (1 minute)
    try:
        url = f'https://api.binance.com/api/v3/klines?symbol={symbol}&interval=1m&startTime={exit_timestamp - 60000}&endTime={exit_timestamp + 60000}&limit=5'
        with urllib.request.urlopen(url, timeout=5) as response:
            klines = json.loads(response.read().decode())
        
        if not klines:
            print(f"  ⚠️ Aucune donnée trouvée pour {symbol}")
            failed_count += 1
            continue
        
        # Prendre la bougie la plus proche
        closest_kline = min(klines, key=lambda k: abs(k[0] - exit_timestamp))
        
        # Utiliser le prix de clôture comme prix de vente
        exit_price = float(closest_kline[4])
        
        # Calculer le P&L
        pnl = (exit_price - entry_price) * quantity
        pnl_pct = ((exit_price / entry_price) - 1) * 100 if entry_price > 0 else 0
        
        # Mettre à jour le trade
        history[idx]['exit_price'] = exit_price
        history[idx]['pnl'] = round(pnl, 4)
        history[idx]['pnl_pct'] = round(pnl_pct, 2)
        
        print(f"  ✅ Prix de vente: {exit_price:.4f} (entrée: {entry_price:.4f})")
        print(f"  💰 P&L: {pnl:+.2f} € ({pnl_pct:+.2f}%)")
        
        fixed_count += 1
        time.sleep(0.2)  # Délai pour ne pas surcharger l'API
        
    except Exception as e:
        print(f"  ❌ Erreur: {e}")
        failed_count += 1
        continue

# Sauvegarder l'historique corrigé
if fixed_count > 0:
    # Backup de l'ancien fichier
    backup_file = history_file.replace('.json', '_backup.json')
    with open(backup_file, 'w', encoding='utf-8') as f:
        json.dump(history, f, indent=2)
    print(f"\n💾 Backup sauvegardé: {backup_file}")
    
    # Sauvegarder le nouveau
    with open(history_file, 'w', encoding='utf-8') as f:
        json.dump(history, f, indent=2)
    
    print(f"\n✅ {fixed_count} trades corrigés")
    if failed_count > 0:
        print(f"⚠️ {failed_count} trades non corrigés")
    print(f"📁 Fichier mis à jour: {history_file}")
else:
    print("\n❌ Aucune correction appliquée")
