"""
Configuration du Bot de Trading Crypto
=======================================
⚠️ IMPORTANT: Configure tes clés API Binance ci-dessous
"""

# ═══════════════════════════════════════════════════════════════════════════════
# API BINANCE
# ═══════════════════════════════════════════════════════════════════════════════

# Mode TESTNET (argent fictif) ou PRODUCTION (argent réel)
TESTNET_MODE = True

# Clés API Binance
# Pour le TESTNET: https://testnet.binance.vision/
# Pour la PRODUCTION: https://www.binance.com/fr/my/settings/api-management
BINANCE_API_KEY = "URgTsdtIau8zUrfGSvmabtEgDwMP5oMltYCPHKvqX41QXmAlwBWVH3chBJ5vIMfC"
BINANCE_API_SECRET = "kAgsn9JOhkrdZd5QhLFNlJJLk6IX1BUQGPs68CHcllwSNnoLDUOHK6ShDgPK3AnQ"

# ═══════════════════════════════════════════════════════════════════════════════
# WATCHLIST
# ═══════════════════════════════════════════════════════════════════════════════

# Cryptos surveillées (peut être modifiée depuis le dashboard)
# ═══════════════════════════════════════════════════════════════════════════════
# SYMBOLES À SURVEILLER
# ═══════════════════════════════════════════════════════════════════════════════
# Chargé depuis watchlist.json. Si vide, le bot utilise les top paires par volume.
try:
    import json
    import os
    watchlist_file = os.path.join(os.path.dirname(__file__), 'watchlist.json')
    if os.path.exists(watchlist_file):
        with open(watchlist_file, 'r', encoding='utf-8') as f:
            watchlist_data = json.load(f)
            WATCH_SYMBOLS = watchlist_data.get('symbols', [])
            print(f"[OK] {len(WATCH_SYMBOLS)} symboles charges depuis watchlist.json")
    else:
        WATCH_SYMBOLS = []
        print(f"[WARN] watchlist.json introuvable, liste vide (sera peuplée dynamiquement)")
except Exception as e:
    WATCH_SYMBOLS = []
    print(f"[ERROR] Erreur chargement watchlist: {e} — liste vide")

# ═══════════════════════════════════════════════════════════════════════════════
# INDICATEURS TECHNIQUES (Optimisés pour Trend Following)
# ═══════════════════════════════════════════════════════════════════════════════

# RSI (Relative Strength Index) - OPTIMISÉ POUR MEILLEUR WIN RATE
RSI_PERIOD = 14
RSI_OVERSOLD = 30.0      # Signal ACHAT plus sélectif (évite faux signaux)
RSI_OVERBOUGHT = 70.0    # Signal VENTE plus précoce (sécurise profits)

# EMA (Exponential Moving Average) - UNIFIÉ AVEC AI_PREDICTOR
# IMPORTANT: Doit correspondre aux valeurs utilisées dans PatternFeatures (ai_predictor.py)
# 🔧 OPTIM 25/03: EMA7/25/99 (vs anciens 9/21/50) — aligné sur chart 15min KITE
# EMA7 : signal très court terme, moins de lag (vs EMA9)
# EMA25: tendance médium terme (vs EMA21, légèrement plus stable)
# EMA99: filtre long terme (~1h39min sur 1min bars) — confirme la macro direction
EMA_SHORT = 7          # EMA7 - court terme (anciennement 9)
EMA_LONG = 25          # EMA25 - moyen terme (anciennement 21)

# ═══════════════════════════════════════════════════════════════════════════════
# EMA_DIFF THRESHOLDS - UNIFIÉS (EMA9-EMA21 gap en %)
# ═══════════════════════════════════════════════════════════════════════════════
CREUX_MIN_GAP = -0.1           # Minimum dip depth pour stratégie CREUX
CREUX_OPTIMAL_START = -0.3     # Zone optimale d'entrée (start)
CREUX_OPTIMAL_END = -1.5       # Zone optimale d'entrée (end)
CREUX_TOO_DEEP = -2.0          # Trop profond, attendre recovery
SQUEEZE_FAVORABLE = -0.15      # EMA gap favorable pour squeeze
SQUEEZE_CROSS_ZONE = 0.20      # Zone de croisement squeeze (±0.20%)
PULLBACK_MIN_GAP = 0.05        # Minimum pour pullback (EMA9 > EMA21)
DEATH_CROSS_LIGHT = -0.05      # Death cross léger (warning)
DEATH_CROSS_MODERATE = -0.15   # Death cross modéré (sell consideration)
DEATH_CROSS_STRONG = -0.30     # Death cross fort (urgent sell)

# Bollinger Bands - ADAPTÉ VOLATILITÉ
BB_PERIOD = 20         # Standard pour volatilité
BB_STD = 2.0           # Écart-type standard

# Nombre de signaux requis pour déclencher un ordre (1-3)
# ⚠️ DÉPRÉCIÉ: Ce paramètre n'est plus utilisé depuis la consolidation
# Toutes les décisions passent maintenant par ai_predictor.py qui utilise
# un système de validation multicouche au lieu de compter les signaux
REQUIRED_SIGNALS = 2  # Conservé pour compatibilité backward

# ═══════════════════════════════════════════════════════════════════════════════
# TREND FOLLOWING - NOUVEAUX PARAMÈTRES
# ═══════════════════════════════════════════════════════════════════════════════

# Seuil de force de tendance (0-100) pour activer le mode agressif
TREND_STRENGTH_THRESHOLD = 40

# ═══════════════════════════════════════════════════════════════════════════════
# MOMENTUM THRESHOLDS - UNIFIÉS (valeurs en %: 0.1 = 0.1%, 1.5 = 1.5%)
# ═══════════════════════════════════════════════════════════════════════════════
MOMENTUM_REVERSAL_MIN = 0.02      # 0.02% - Détection PRÉCOCE du retournement (17h36 WIFUSDT)
MOMENTUM_REVERSAL_MAX = 0.8       # 0.8% - Maximum pour squeeze/dip (marché actif)
MOMENTUM_MODERATE = 1.0           # 1.0% - Momentum modéré
MOMENTUM_THRESHOLD = 1.5          # 1.5% - Trend following fort (legacy)
MOMENTUM_STRONG = 1.5             # 1.5% - Confirmation tendance forte
MOMENTUM_DROP_LIGHT = 0.2         # 0.2% - Baisse légère (seuil absolu, le code applique le signe -)
MOMENTUM_DROP_MODERATE = 0.3      # 0.3% - Baisse modérée (code: > -CONSTANT → > -0.3%)
MOMENTUM_DROP_SIGNIFICANT = 0.8   # 0.8% - Baisse significative
MOMENTUM_DROP_SEVERE = 1.5        # 1.5% - Baisse sévère
MOMENTUM_CRASH = 3.0              # 3% - Crash (blocage)

# ═══════════════════════════════════════════════════════════════════════════════
# GESTION DU RISQUE - ADAPTÉ TREND FOLLOWING + TRAILING STOP
# ═══════════════════════════════════════════════════════════════════════════════

# Stop Loss INITIAL (% de perte max avant vente automatique)
# 🔧 FIX 01/03 v2: 2.5% → 1.8% — Crash-test: SL = -601$ (91 trades, 0% WR)
# Le ratio G/P était 0.57:1 (perte moy 3.28$ vs gain moy 1.86$)
# SL 1.8% réduit la perte max par trade → ratio G/P meilleur
STOP_LOSS_PERCENT = 1.8

# Take Profit (% de gain avant vente automatique)
# 🔧 FIX 25/03: 5.0% → 3.0% — TP trop ambitieux pour 2h de hold sur 1min chart
# Analyse 25/03: KITE +2.78% en 120min → TP jamais atteint → exit via MAX_HOLD
# Avec SL=1.5% et TP=3%, R/R = 2.0:1 — gains sécurisés avant expiration
TAKE_PROFIT_PERCENT = 3.0

# TRAILING STOP - Active le stop dynamique qui suit le prix
ENABLE_TRAILING_STOP = True

# NOTE: TRAILING_STOP_DISTANCE et TRAILING_STOP_ACTIVATION ci-dessous sont
# gérés par l'optimizer IA (via ai_optimized_config.py) mais le bot utilise
# TRAILING_TIERS pour la logique réelle. Ces deux variables sont conservées
# pour la compatibilité du pipeline d'auto-optimisation uniquement.
TRAILING_STOP_DISTANCE = 1.5

# Seuil d'activation du trailing stop (% de profit minimum)
TRAILING_STOP_ACTIVATION = 2.5  # Activé après 2.5% de profit (non utilisé — voir TRAILING_TIERS)

# ═══════════════════════════════════════════════════════
# TRAILING STOP PROGRESSIF PAR PALIERS — Sécurisation gains
# Plus on est en profit, plus le trailing est serré.
# Cela empêche de rendre tous les gains quand le marché retourne.
# Palier 0 → baseline (pas encore en profit significatif)
# Palier 1 → En profit léger : protéger break-even
# Palier 2 → Bon profit : ne plus rendre la moitié
# Palier 3 → Excellent profit : protéger au moins 70%
# Palier 4 → Exceptionnel : protéger 80%
# ═══════════════════════════════════════════════════════
TRAILING_TIERS = [
    # (profit_min_pct, trailing_distance_pct, lock_profit_ratio)
    # 🔧 FIX 08/03: Ajout paliers précoces — évite de rendre tous les gains sous 1%
    # Avant: 1ère protection à +1% → une position qui pic à +0.9% n'avait AUCUN trailing
    (0.3, 0.3,  0.0),   # +0.3%→ trail -0.3% depuis max (protection gain dès le début)
    (0.7, 0.5,  0.0),   # +0.7%→ trail -0.5% depuis max (SL remonte à ~+0.2% au-dessus entrée)
    (1.2, 0.8,  0.0),   # +1.2%→ trail -0.8% depuis max (break-even+ garanti)
    (2.5, 1.0,  0.0),   # +2.5%→ trail -1.0% depuis max
    (4.0, 1.2,  0.50),  # +4%  → trail -1.2%  + lock 50% du gain actuel
    (6.0, 1.4,  0.65),  # +6%  → trail -1.4%  + lock 65% du gain actuel
    (9.0, 1.6,  0.75),  # +9%  → trail -1.6%  + lock 75% du gain actuel
]

# ═══════════════════════════════════════════════════════
# PORTFOLIO BEAR MELT DETECTOR
# Si X% des positions chutent simultanément → vente anticipée des positions profitables
# Protège le portefeuille lors d'un krach général (toutes les cryptos en baisse)
# 🔧 FIX 01/04: Seuils abaissés pour réagir plus vite aux retournements
# ═══════════════════════════════════════════════════════
PORTFOLIO_BEAR_MELT_RATIO    = 0.50  # 🔧 FIX 01/04: 0.6→0.50 — 50% des positions en chute = alerte
PORTFOLIO_BEAR_MELT_DROP_PCT = -0.3  # 🔧 FIX 01/04: -0.4→-0.3 — seuil de momentum plus sensible
PORTFOLIO_BEAR_MELT_MIN_PNL  = 0.2   # 🔧 FIX 01/04: 0.5→0.2 — sécuriser même les petits gains

# ═══════════════════════════════════════════════════════
# MAX HOLDING TIME SELON RÉGIME
# ═══════════════════════════════════════════════════════
MAX_HOLD_MINUTES_BULL       = 360   # 🔧 FIX 25/03: 4h → 6h en BULL (laisse les grands moves se développer)
MAX_HOLD_MINUTES_NEUTRAL    = 120   # 2h en NEUTRAL (était 180 — 3h trop long pour stratégie short)
MAX_HOLD_MINUTES_BEAR       = 90    # 1h30 en BEAR — stoppe les positions qui stagnent

# Taille maximale d'une position (en USDT)
MAX_ORDER_SIZE = 500  # Augmenté pour positions plus significatives

# Nombre maximum de positions ouvertes simultanément
# OPTIMISÉ 13/01: Réduit de 30 à 20 pour éviter surexposition (observé 28/30)
MAX_OPEN_POSITIONS = 20  # Équilibre opportunités vs liquidité

# Montant minimum pour un ordre (en USDT)
# Binance Testnet accepte des ordres très petits
MIN_ORDER_SIZE = 10

# Pourcentage maximum du solde à risquer par trade
MAX_RISK_PER_TRADE = 20  # 20% du solde max par trade (solde: ~5000 USDT)

# Intervalle de temps pour les bougies (1m, 5m, 15m, 1h, 4h, 1d)
# 5m = réactif pour la stratégie "Buy the Dip"
DEFAULT_INTERVAL = "5m"

# ═══════════════════════════════════════════════════════════════════════════════
# FILTRES DE SÉCURITÉ - ÉVITER LES MAUVAIS TRADES
# ═══════════════════════════════════════════════════════════════════════════════

# Score IA minimum pour autoriser un achat (0-100)
# 🔧 FIX 27/02: Aligné avec le seuil réel utilisé dans trading_bot.py (MIN_SCORE_ABSOLUTE=65)
MIN_AI_SCORE_FOR_BUY = 65

# Ne JAMAIS acheter si tendance baissière confirmée
BLOCK_BUY_ON_BEARISH = True

# Nombre minimum de signaux pour déclencher un achat
# Réduit de 5 à 3 pour permettre plus d'entrées
MIN_BUY_SIGNALS = 3

# Nombre minimum de signaux pour déclencher une vente forcée
# Augmenté de 3 à 4 pour laisser plus de temps aux trades
MIN_SELL_SIGNALS = 4

# ═══════════════════════════════════════════════════════════════════════════════
# DÉTECTION BREAKOUT
# ═══════════════════════════════════════════════════════════════════════════════

# Active la détection de breakout (crypto qui dépasse ses plus hauts)
ENABLE_BREAKOUT_DETECTION = True

# Force minimum du breakout pour le considérer (%)
MIN_BREAKOUT_STRENGTH = 0.5

# Bonus de signaux pour un breakout confirmé
BREAKOUT_SIGNAL_BONUS = 3

# ═══════════════════════════════════════════════════════════════════════════════
# NOTIFICATIONS TELEGRAM
# ═══════════════════════════════════════════════════════════════════════════════

# Activer les notifications Telegram
ENABLE_TELEGRAM = False

# Clés Telegram (obtenir via @BotFather)
TELEGRAM_API_KEY = ""  # Token du bot Telegram
TELEGRAM_CHAT_ID = ""  # ID du chat (obtenir via @userinfobot)

# Types de notifications à envoyer
TELEGRAM_NOTIFY_BUY = True
TELEGRAM_NOTIFY_SELL = True
TELEGRAM_NOTIFY_STOP_LOSS = True
TELEGRAM_NOTIFY_TAKE_PROFIT = True
TELEGRAM_NOTIFY_ERRORS = True
TELEGRAM_NOTIFY_DAILY_SUMMARY = True
TELEGRAM_NOTIFY_BOT_START_STOP = True

# ═══════════════════════════════════════════════════════════════════════════════
# STRATÉGIES AVANCÉES
# ═══════════════════════════════════════════════════════════════════════════════

# Activer les stratégies avancées (11 stratégies techniques)
ENABLE_ADVANCED_STRATEGIES = True

# Stratégies à activer (liste)
ACTIVE_STRATEGIES = [
    "golden_cross",       # Croisement EMA 20/50/100
    "stoch_rsi_macd",    # Combinaison Stoch/RSI/MACD
    "triple_ema",        # Triple EMA rapide
    "stoch_bb",          # Stochastique + Bollinger Bands
    "breakout",          # Détection de cassures
    "candle_wick"        # Patterns de chandelier
]

# Seuil de consensus pour les stratégies (%)
# Ex: 60 = au moins 60% des stratégies doivent être d'accord
STRATEGY_CONSENSUS_THRESHOLD = 60

# ═══════════════════════════════════════════════════════════════════════════════
# MACHINE LEARNING ENSEMBLE
# ═══════════════════════════════════════════════════════════════════════════════

# Activer les méthodes ensemble ML (Random Forest + Gradient Boosting)
ENABLE_ENSEMBLE_ML = True

# Taille minimale de l'historique pour entraîner les modèles
ML_MIN_TRAINING_SAMPLES = 200

# Ré-entraîner les modèles tous les N trades
ML_RETRAIN_INTERVAL = 50

# Seuil de confiance ML pour valider un signal (0-1)
ML_CONFIDENCE_THRESHOLD = 0.65

# Fichier de sauvegarde des modèles
ML_MODELS_FILE = "ensemble_models.pkl"

# ═══════════════════════════════════════════════════════════════════════════════
# FEATURE ENGINEERING
# ═══════════════════════════════════════════════════════════════════════════════

# Activer le feature engineering avancé
ENABLE_ADVANCED_FEATURES = True

# Utiliser TA-Lib si disponible
USE_TALIB = True

# Fenêtres pour les features statistiques
FEATURE_WINDOWS = [5, 10, 20, 50]

# ═══════════════════════════════════════════════════════════════════════════════
# ROTATION INTELLIGENTE - Paramètres de rotation du portefeuille
# MODIFIÉ le 28/12/2025 - Permettre la rotation des positions en perte
# vers de meilleures opportunités (ex: vendre WIFUSDT en perte pour acheter FET)
# ═══════════════════════════════════════════════════════════════════════════════

# Activer la rotation intelligente
ENABLE_SMART_ROTATION = True

# Score minimum pour considérer un cycle comme terminé (0-100)
# RÉDUIT à 10 - Permettre rotations dès que stagnation détectée
ROTATION_MIN_CYCLE_END_SCORE = 10

# Score minimum pour qu'une opportunité de rotation soit valide
# RÉDUIT à 50 - Accepter les bonnes opportunités
ROTATION_MIN_OPPORTUNITY_SCORE = 50

# Différence minimum de score pour justifier une rotation
# RÉDUIT à 5 - Formule plus simple basée sur la qualité de l'opportunité
ROTATION_MIN_SCORE_ADVANTAGE = 5

# Profit minimum (%) accepté pour rotation (négatif = perte tolérée)
# ÉLARGI à -0.5 - Permettre de sortir des positions en légère perte
ROTATION_MIN_PROFIT = -0.5

# Temps minimum en position avant rotation (minutes)
# RÉDUIT à 10 - Plus réactif
ROTATION_MIN_HOLD_TIME = 10

# Cooldown entre rotations pour le même symbole (minutes)
ROTATION_COOLDOWN = 30

# Maximum de rotations par heure
# AUGMENTÉ à 4 - Permettre plus de rotations si nécessaire
ROTATION_MAX_PER_HOUR = 4

# ═══════════════════════════════════════════════════════════════════════════════
# EXPOSITION AU MARCHÉ - Gestion globale du risque
# Paramètres pour contrôler l'exposition totale et par position
# ═══════════════════════════════════════════════════════════════════════════════

# Exposition totale maximale (% du solde total)
# Actuellement ~450 USDT sur ~5000 USDT = 9% (bon niveau)
MAX_TOTAL_EXPOSURE_PERCENT = 15

# Exposition maximale par crypto (% du solde)
# Limite chaque position individuelle
MAX_EXPOSURE_PER_CRYPTO = 2

# Nombre maximum de trades par heure pour éviter le sur-trading
# RÉDUIT pour améliorer le win rate
MAX_TRADES_PER_HOUR = 8

# ═══════════════════════════════════════════════════════════════════════════════
# FILTRE HORAIRE UTC — Heures où les achats sont BLOQUÉS
# 🔧 FIX 01/03: Crash-test montre WR < 40% entre 06h-12h UTC (session Asie/Europe)
# Heures 06,07,08,10,11,12 = WR 25-36% → toxiques pour les achats
# ═══════════════════════════════════════════════════════════════════════════════
# � FIX 02/03: REDUCTION DRASTIQUE — 14h/24 bloquées = 58% du temps!
# Le bot RATE toutes les opportunités de pump (15h-17h local = 14h-16h UTC BLOQUÉ)
# Les données "0% WR" étaient biaisées par le bug quick-exit (corrigé le 09/02)
# AVANT: [3,4,5,6,7,8,10,11,12,13,14,15,16,19] = 14h bloquées = bot mort
# APRÈS: [3,4,5] = seuls les dead-zone asiatiques (volume quasi-nul)
# Les heures 6-23 UTC incluent les sessions EU+US = LÀ OÙ SE PASSENT LES PUMPS
BLOCKED_TRADING_HOURS_UTC = [3, 4, 5]  # Dead zone asiatique uniquement
ENABLE_HOUR_FILTER = True  # Activer le filtre horaire

# Mode conservateur: réduit l'exposition en période de volatilité
ENABLE_CONSERVATIVE_MODE = True

# Seuil de volatilité BTC pour activer le mode conservateur (%)
BTC_VOLATILITY_THRESHOLD = 3.0

# Facteur de réduction en mode conservateur (0.5 = positions 2x plus petites)
CONSERVATIVE_FACTOR = 0.5

# ═══════════════════════════════════════════════════════════════════════════════
# BACKTESTING
# ═══════════════════════════════════════════════════════════════════════════════

# Frais de commission pour le backtesting (%)
BACKTEST_COMMISSION_RATE = 0.1  # 0.1% par trade

# Capital initial pour backtesting (USDT)
BACKTEST_INITIAL_BALANCE = 10000

# Walk-forward testing
BACKTEST_TRAIN_WINDOW = 100  # Nombre de bougies pour l'entraînement
BACKTEST_TEST_WINDOW = 20    # Nombre de bougies pour le test

# ═══════════════════════════════════════════════════════════════════════════════
# PERSISTANCE
# ═══════════════════════════════════════════════════════════════════════════════

# Utiliser pickle pour la persistance (plus léger que JSON)
USE_PICKLE_PERSISTENCE = True

# Fichiers pickle
PICKLE_POSITIONS_FILE = "positions.pkl"
PICKLE_INDICATORS_FILE = "indicators.pkl"
PICKLE_TRADE_HISTORY_FILE = "trade_history.pkl"

# ═══════════════════════════════════════════════════════════════════════════════
# AFFICHAGE
# ═══════════════════════════════════════════════════════════════════════════════

# Devise d'affichage ("USD" ou "EUR")
DISPLAY_CURRENCY = "EUR"

# ═══════════════════════════════════════════════════════════════════════════════
# NOTES
# ═══════════════════════════════════════════════════════════════════════════════

# 1. Ces paramètres peuvent être modifiés en temps réel via bot_settings.json
# 2. Le dashboard permet d'ajuster les valeurs sans redémarrer le bot
# 3. Les optimisations IA peuvent suggérer de nouvelles valeurs
# 4. TOUJOURS tester en mode TESTNET avant de passer en PRODUCTION
# 5. Nouvelles fonctionnalités ajoutées:
#    - Notifications Telegram pour alertes en temps réel
#    - 11 stratégies techniques avancées
#    - Méthodes ensemble ML (Random Forest + Gradient Boosting)
#    - Feature engineering avancé avec statistiques
#    - Backtesting et walk-forward testing
#    - Persistance optimisée avec pickle

# ═══════════════════════════════════════════════════════════════════════════════
# OVERRIDE IA — Charge les optimisations de ai_optimized_config.py
# ═══════════════════════════════════════════════════════════════════════════════
# Le pipeline IA écrit ses optimisations dans ai_optimized_config.py.
# Ce bloc charge ces valeurs pour qu'elles soient effectives dans le bot.
# Les paramètres ICI (config.py) servent de valeurs par défaut.

try:
    import ai_optimized_config as _ai_cfg

    # Liste des paramètres numériques/bool à synchroniser
    _OVERRIDE_KEYS = [
        'STOP_LOSS_PERCENT', 'TAKE_PROFIT_PERCENT',
        'ENABLE_TRAILING_STOP', 'TRAILING_STOP_DISTANCE', 'TRAILING_STOP_ACTIVATION',
        'MAX_OPEN_POSITIONS', 'MIN_AI_SCORE_FOR_BUY', 'MIN_BUY_SIGNALS', 'MIN_SELL_SIGNALS',
        'STRATEGY_CONSENSUS_THRESHOLD', 'ML_CONFIDENCE_THRESHOLD',
        'ENABLE_CONSERVATIVE_MODE', 'CONSERVATIVE_FACTOR', 'BTC_VOLATILITY_THRESHOLD',
        'MAX_TRADES_PER_HOUR', 'MAX_TOTAL_EXPOSURE_PERCENT',
        'ENABLE_SMART_ROTATION', 'REQUIRED_SIGNALS',
    ]
    _overridden = []
    for _k in _OVERRIDE_KEYS:
        if hasattr(_ai_cfg, _k):
            _old = globals().get(_k)
            _new = getattr(_ai_cfg, _k)
            if _old != _new:
                globals()[_k] = _new
                _overridden.append(_k)

    if _overridden:
        print(f"[IA] {len(_overridden)} parametre(s) surcharges depuis ai_optimized_config.py: {', '.join(_overridden)}")
    del _ai_cfg, _OVERRIDE_KEYS, _overridden, _k, _old, _new
except ImportError:
    pass  # ai_optimized_config.py absent → on garde les valeurs par défaut
except Exception as _e:
    print(f"[WARN] Erreur chargement ai_optimized_config.py: {_e}")
