#!/usr/bin/env python3
"""
Script pour fermer TOUTES les positions et redémarrer avec une stratégie qualité
"""

import sys
import logging
from hyperliquid_client import HyperliquidClient

# Configuration du logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def close_all_positions():
    """Ferme toutes les positions ouvertes"""

    print("=" * 60)
    print("🧹 NETTOYAGE COMPLET - FERMETURE DE TOUTES LES POSITIONS")
    print("=" * 60)

    try:
        # Initialiser le client
        logger.info("Initialisation du client Hyperliquid...")
        client = HyperliquidClient()

        if not client.exchange:
            logger.error("❌ Exchange API non disponible")
            return False

        # Récupérer les positions actuelles
        logger.info("Récupération des positions actuelles...")
        account_state = client.get_account_state()

        if not account_state or 'assetPositions' not in account_state:
            logger.info("✅ Aucune position à fermer")
            return True

        positions = account_state['assetPositions']
        logger.info(f"Trouvé {len(positions)} positions à fermer")

        if len(positions) == 0:
            logger.info("✅ Aucune position à fermer")
            return True

        # Afficher les positions avant fermeture
        print("\nPositions à fermer:")
        print("Symbol | Side | Size | PnL")
        print("-" * 35)

        positions_to_close = []
        for pos in positions:
            symbol = pos['position']['coin']
            size = float(pos['position']['szi'])
            unrealized_pnl = float(pos['position']['unrealizedPnl'])

            side = "LONG" if size > 0 else "SHORT"
            abs_size = abs(size)

            print(f"{symbol:6} | {side:4} | {abs_size:8.3f} | ${unrealized_pnl:+8.2f}")

            positions_to_close.append({
                'symbol': symbol,
                'size': abs_size,
                'is_long': size > 0
            })

        print(f"\n⚠️  ATTENTION: Fermeture de {len(positions_to_close)} positions")

        # Demander confirmation
        response = input("\nConfirmer la fermeture de TOUTES les positions ? (oui/non): ")
        if response.lower() not in ['oui', 'o', 'yes', 'y']:
            print("❌ Opération annulée")
            return False

        print("\n🔄 Fermeture des positions en cours...")

        # Fermer chaque position
        closed_count = 0
        for pos_info in positions_to_close:
            symbol = pos_info['symbol']
            size = pos_info['size']
            is_long = pos_info['is_long']

            try:
                logger.info(f"Fermeture {symbol} {'LONG' if is_long else 'SHORT'} size={size}")

                # Ordre de fermeture (inverse de la position)
                result = client.place_market_order(
                    symbol=symbol,
                    is_buy=not is_long,  # Inverse: SELL pour fermer LONG, BUY pour fermer SHORT
                    size=size,
                    reduce_only=True,  # Réduction seulement
                    order_tag=f"CLOSE_ALL_{symbol}"
                )

                if result and result.get('success'):
                    logger.info(f"✅ {symbol} fermé avec succès")
                    closed_count += 1
                else:
                    logger.error(f"❌ Échec fermeture {symbol}: {result.get('error', 'Erreur inconnue')}")

                # Délai entre les ordres
                import time
                time.sleep(1)

            except Exception as e:
                logger.error(f"❌ Erreur fermeture {symbol}: {e}")

        print(f"\n🎯 RÉSULTAT: {closed_count}/{len(positions_to_close)} positions fermées")

        if closed_count == len(positions_to_close):
            print("✅ TOUTES LES POSITIONS FERMÉES AVEC SUCCÈS")
            print("Le système va maintenant se concentrer sur les tokens de HAUTE QUALITÉ uniquement")
            return True
        else:
            print("⚠️  Certaines positions n'ont pas pu être fermées")
            return False

    except Exception as e:
        logger.error(f"❌ Erreur générale: {e}", exc_info=True)
        return False

def main():
    print("🚀 RESTART STRATÉGIE QUALITÉ")
    print("Fermeture de toutes les positions pour un nouveau départ")

    success = close_all_positions()

    if success:
        print("\n" + "=" * 60)
        print("✅ NETTOYAGE TERMINÉ - PRÊT POUR STRATÉGIE QUALITÉ")
        print("=" * 60)
        print("Redémarrez le service trading pour la nouvelle stratégie:")
        print("systemctl restart crypto-trader.service")
    else:
        print("\n❌ Échec du nettoyage - Vérifiez les positions manuellement")

if __name__ == "__main__":
    main()