#!/usr/bin/env python3
"""
Configuration du système de trading
"""

# =============================================================================
# MODE DE TRADING - À MODIFIER SELON VOS BESOINS
# =============================================================================

# Modes disponibles:
# - "SIMULATION"    : Trading simulé avec capital virtuel
# - "LIVE_MANUAL"   : Trading réel avec confirmation manuelle
# - "LIVE_AUTO"     : Trading réel automatique (ATTENTION: très risqué!)

# MODE LIVE_AUTO AVEC TOUTES LES CORRECTIONS APPLIQUÉES
# - Cooldown réactivé (3min entre trades)
# - Overtrading protection (max 4/h par symbole)
# - Filtre intelligent activé
# - record_position_close() ajouté partout
TRADING_MODE = "LIVE_AUTO"

# TRADING AUTOMATIQUE ACTIVÉ AVEC PROTECTIONS
AUTO_TRADING_ENABLED = True

# =============================================================================
# PARAMÈTRES FINANCIERS
# =============================================================================

# Capital pour simulation (ignoré en mode LIVE)
SIMULATION_INITIAL_BALANCE = 10000.0

# Paramètres de trading ADAPTATIFS selon les opportunités
# RÉDUIT: Qualité > Quantité pour améliorer le win rate
MAX_SIMULTANEOUS_POSITIONS = 5      # Max 5 positions simultanées (qualité prioritaire)

# SYSTÈME ADAPTATIF DE CONFIANCE selon l'activité du marché
# AUGMENTÉ: Filtrage plus strict pour réduire les faux signaux
MIN_CONFIDENCE_THRESHOLD = 55.0     # Confiance minimale 55% (adapté marché neutre)
MIN_CONFIDENCE_THRESHOLD_LOW = 50.0 # Confiance minimale 50% (période creuse)
ADAPTIVE_CONFIDENCE_ENABLED = True  # Activer l'adaptation automatique

# Système de position sizing intelligent
USE_FIXED_POSITION_SIZE = True      # Calcul intelligent: balance/max_positions
FIXED_POSITION_SIZE_USD = None      # None = calcul auto: balance_totale/nb_positions_max
MIN_POSITION_SIZE_USD = 35.0        # $35 marge minimum par position (évite positions trop petites)

# Gestion des leverages AGRESSIFS
MAX_LEVERAGE = 40                   # AUGMENTÉ: Leverage maximum global - plus agressif
LEVERAGE_SAFETY_FACTOR = 0.98       # AUGMENTÉ: 98% du max disponible - très agressif
MIN_LEVERAGE_THRESHOLD = 8          # Leverage minimum 8x (peut être adapté selon token)
LEVERAGE_EXCEPTIONS = {             # Tokens avec leverage max < 8x
    'ATOM': 5,  # Max 5x sur Hyperliquid
    'PROVE': 5,
    'HEMI': 5,
}

# Gestion des risques
PROFIT_TARGET_MULTIPLIER = 2.0      # Take profit = 2x le stop loss
TRAILING_STOP_DISTANCE = 15.0       # Distance trailing stop (%)

# =============================================================================
# FILTRE QUALITÉ DES CRYPTOS
# =============================================================================

# Activer le filtre de qualité pour éviter les shitcoins
USE_QUALITY_FILTER = True

# SYSTÈME DE CLASSIFICATION DYNAMIQUE DES MARCHÉS
# Les listes sont mises à jour automatiquement depuis Hyperliquid
USE_DYNAMIC_MARKET_CLASSIFICATION = True

def get_dynamic_quality_lists():
    """Récupère les listes de qualité mises à jour dynamiquement"""
    if not USE_DYNAMIC_MARKET_CLASSIFICATION:
        return _get_static_quality_lists()

    try:
        from dynamic_market_classifier import DynamicMarketClassifier
        classifier = DynamicMarketClassifier()
        high_quality, medium_quality = classifier.get_updated_classification()
        return list(high_quality), list(medium_quality)
    except Exception as e:
        import logging
        logging.getLogger(__name__).warning(f"Erreur classification dynamique: {e}, fallback statique")
        return _get_static_quality_lists()

def _get_static_quality_lists():
    """Listes statiques de fallback"""
    high = [
        'BTC', 'ETH', 'BNB', 'XRP', 'ADA', 'SOL', 'DOGE', 'DOT', 'MATIC', 'AVAX',
        'UNI', 'AAVE', 'COMP', 'LINK', 'SUSHI', 'CRV', 'YFI', 'MKR', 'SNX',
        'ATOM', 'FTM', 'ALGO', 'NEAR', 'FLOW', 'ICP', 'EOS', 'TRX', 'XTZ',
        'RENDER', 'FIL', 'GRT', 'ENS', 'LDO', 'RPL', 'OP', 'ARB'
    ]
    medium = [
        'PEPE', 'SHIB', 'WIF', 'BONK', 'FLOKI', 'BRETT', 'POPCAT',
        'PENDLE', 'JUP', 'WLD', 'STX', 'SEI', 'SUI', 'APT', 'TIA',
        'INJ', 'TAO', 'THETA', 'VET', 'HBAR', 'LTC', 'BCH', 'ETC',
        'LINEA', 'PENGU', 'W', 'PROMPT'
    ]
    return high, medium

# Récupérer les listes (dynamiques ou statiques)
HIGH_QUALITY_CRYPTOS, MEDIUM_QUALITY_CRYPTOS = get_dynamic_quality_lists()

# Limite ULTRA-STRICTE sur les cryptos de qualité moyenne
MAX_MEDIUM_QUALITY_RATIO = 0.2       # RÉDUIT: Max 20% = 1 position sur 5 max

# Stratégie ULTRA-SÉLECTIVE: EXCLUSION TOTALE DES SHITCOINS
SHITCOIN_STRATEGY = "EXCLUDE"        # EXCLUDE: Aucun shitcoin autorisé - 100% qualité
SHITCOIN_SHORT_BIAS_STRENGTH = 1.0   # Inutilisé en mode EXCLUDE
SHITCOIN_MAX_POSITIONS = 0           # ZÉRO shitcoin autorisé

# =============================================================================
# PARAMÈTRES TECHNIQUES
# =============================================================================

# Oracles et signaux
SIGNAL_REFRESH_INTERVAL = 30        # Intervalle de refresh des signaux (sec)
ENABLE_BINANCE_ORACLE = True
ENABLE_HYPERLIQUID_ORACLE = True
ENABLE_SENTIMENT_ORACLE = True

# Logging
LOG_LEVEL = "INFO"                   # DEBUG, INFO, WARNING, ERROR
LOG_TO_FILE = True
LOG_FILE_PATH = "logs/trading_engine.log"

# =============================================================================
# SÉCURITÉ
# =============================================================================

# Protection contre les erreurs
ENABLE_SAFETY_CHECKS = True
MAX_DAILY_LOSS_PERCENT = 10.0       # Arrêt si perte > 10% par jour
EMERGENCY_STOP = False              # Arrêt d'urgence global

# MODE SBOT: Désactiver les fermetures automatiques (géré côté bot)
DISABLE_AUTO_CLOSE_TO_HYPERLIQUID = True  # NE PAS fermer positions sur Hyperliquid
ALLOW_EMERGENCY_CLOSE = True  # Permettre fermetures d'urgence (stop loss < -15%)
EMERGENCY_STOP_LOSS_PERCENT = -15.0  # Seuil d'urgence pour fermeture forcée

# =============================================================================
# VALIDATION DE LA CONFIGURATION
# =============================================================================

def validate_config():
    """Valide la configuration et affiche des avertissements si nécessaire"""
    
    valid_modes = ["SIMULATION", "LIVE_MANUAL", "LIVE_AUTO"]
    if TRADING_MODE not in valid_modes:
        raise ValueError(f"Mode invalide: {TRADING_MODE}. Modes valides: {valid_modes}")
    
    # Avertissements de sécurité
    if TRADING_MODE == "LIVE_AUTO":
        print("ATTENTION: Mode LIVE_AUTO active - Trading automatique avec de l'argent reel!")
        print("Assurez-vous que tous les parametres sont corrects.")
    
    if TRADING_MODE in ["LIVE_MANUAL", "LIVE_AUTO"]:
        print(f"[LIVE] Mode LIVE activé: {TRADING_MODE}")
        print("[LIVE] Le trading se fera avec de l'argent réel via Hyperliquid")
    else:
        print(f"[SIM] Mode SIMULATION activé avec ${SIMULATION_INITIAL_BALANCE:,.2f}")
    
    print(f"[CONFIG] Position sizing: Fixed ${MIN_POSITION_SIZE_USD:.0f} minimum | Max positions: {MAX_SIMULTANEOUS_POSITIONS}")
    print(f"[CONFIG] Take profit: {PROFIT_TARGET_MULTIPLIER}x | Trailing stop: {TRAILING_STOP_DISTANCE}%")

# =============================================================================
# CONFIGURATION DES SERVEURS DE SIGNAUX
# =============================================================================

# Serveur Enhanced Signal Generator
SIGNAL_SERVER_HOST = "localhost"
SIGNAL_SERVER_PORT = 8001

# Serveur Bias Analyzer
BIAS_SERVER_HOST = "localhost"
BIAS_SERVER_PORT = 8002

# =============================================================================
# PARAMÈTRES DE QUALITÉ DES SIGNAUX
# =============================================================================

# SYSTÈME ADAPTATIF DE QUALITÉ DES SIGNAUX selon l'activité du marché
# Équilibré: pas trop strict pour laisser passer les bons signaux
MIN_SIGNAL_QUALITY_SCORE = 0.35        # Qualité minimale 35% (marché très flat)
MIN_SIGNAL_QUALITY_SCORE_LOW = 0.30    # Qualité minimale 30% (période creuse)
ADAPTIVE_QUALITY_ENABLED = True        # Activer l'adaptation automatique

# =============================================================================
# FONCTION ADAPTIVE POUR LES PÉRIODES CREUSES
# =============================================================================

def get_adaptive_thresholds(active_positions_count: int, recent_signals_count: int) -> tuple:
    """
    Calcule les seuils adaptatifs selon l'activité du marché

    Args:
        active_positions_count: Nombre de positions actives
        recent_signals_count: Nombre de signaux des dernières 2 heures

    Returns:
        tuple: (confidence_threshold, quality_threshold)
    """

    # Détection période creuse: peu de positions + peu de signaux récents
    is_low_activity = (active_positions_count <= 2 and recent_signals_count <= 3)

    if ADAPTIVE_CONFIDENCE_ENABLED and is_low_activity:
        confidence_threshold = MIN_CONFIDENCE_THRESHOLD_LOW  # 65%
        quality_threshold = MIN_SIGNAL_QUALITY_SCORE_LOW    # 0.4
        return confidence_threshold, quality_threshold, "LOW_ACTIVITY"
    else:
        confidence_threshold = MIN_CONFIDENCE_THRESHOLD     # 75%
        quality_threshold = MIN_SIGNAL_QUALITY_SCORE       # 0.5
        return confidence_threshold, quality_threshold, "NORMAL_ACTIVITY"

if __name__ == "__main__":
    validate_config()