from trading.binance_client import BinanceClient
from bot.config import Config
import logging
import random

logger = logging.getLogger(__name__)
# ==================================================================
# WATCHLIST INSTITUCIONAL
# ==================================================================
# Watchlist Institucional: Las 30 criptomonedas más líquidas, seguras y respetadas técnicamente.
# Esto garantiza que el bot NUNCA recomiende monedas extrañas, sintéticas o de baja capitalización.
INSTITUTIONAL_WATCHLIST = [
    # Top 10 - Mayor capitalización
    "BTC/USDT", "ETH/USDT", "SOL/USDT", "BNB/USDT", "XRP/USDT",
    "ADA/USDT", "DOGE/USDT", "DOT/USDT", "AVAX/USDT", "LINK/USDT",
    # Mid Caps - Alta liquidez
    "UNI/USDT", "LTC/USDT", "BCH/USDT", "ATOM/USDT", "FIL/USDT",
    "APT/USDT", "ARB/USDT", "OP/USDT", "NEAR/USDT", "INJ/USDT",
    # Altcoins prometedoras
    "SUI/USDT", "RNDR/USDT", "FET/USDT", "TIA/USDT", "SEI/USDT",
    "MATIC/USDT", "ETC/USDT", "XLM/USDT", "ALGO/USDT", "VET/USDT",
    # Nuevas adiciones - Proyectos sólidos
    "HBAR/USDT", "IMX/USDT", "STX/USDT", "GRT/USDT", "RUNE/USDT",
    "AAVE/USDT", "MKR/USDT", "SNX/USDT", "SAND/USDT", "MANA/USDT",
    # Layer 2 y DeFi
    "ARB/USDT", "OP/USDT", "LDO/USDT", "CRV/USDT", "COMP/USDT",
    # Gaming y Metaverso
    "GALA/USDT", "AXS/USDT", "ENJ/USDT", "CHZ/USDT", "FLOW/USDT"
]

# ==================================================================
# OBTENER SÍMBOLOS POR VOLUMEN
# ==================================================================
def get_top_symbols_by_volume(limit: int = 6):
    """
    Obtiene los símbolos con mayor volumen de las últimas 24h.
    Usado específicamente para la función "Top 6 Criptos" del menú principal.
    """
    try:
        exchange = Config.EXCHANGE_PRIORITY[0] if Config.EXCHANGE_PRIORITY else 'bitget'
        client = BinanceClient(preferred_exchange=exchange)
        tickers = client.fetch_tickers()
        
        if not tickers:
            return Config.TOP_SYMBOLS[:limit]
        
        # Filtrar pares USDT válidos y excluir apalancados
        usdt_pairs = {
            k: v for k, v in tickers.items() 
            if (k.endswith('/USDT') or k.endswith('USDT')) 
            and 'UP' not in k and 'DOWN' not in k
            and len(k.replace('/USDT', '').replace('USDT', '')) <= 10
        }
        
        # Stablecoins a excluir
        exclude_coins = {'USDC', 'USDT', 'DAI', 'BUSD', 'TUSD', 'FDUSD', 'USDP', 'EUR', 'EURT', 'EURS'}
        
        valid_pairs = []
        for sym, data in usdt_pairs.items():
            base_coin = sym.replace('/USDT', '').replace('USDT', '')
            
            if base_coin in exclude_coins:
                continue
            
            volume = float(data.get('quoteVolume', 0) or data.get('volume', 0) or 0)
            if volume < 500000: # Mínimo 500k para evitar basura
                continue
            
            valid_pairs.append({'symbol': sym, 'volume': volume})
        
        # Ordenar por volumen descendente
        valid_pairs.sort(key=lambda x: x['volume'], reverse=True)
        
        top_symbols = [item['symbol'] for item in valid_pairs[:limit]]
        
        if not top_symbols:
            return Config.TOP_SYMBOLS[:limit]
        
        return top_symbols
    except Exception as e:
        logger.error(f"Error obteniendo top símbolos por volumen: {e}")
        return Config.TOP_SYMBOLS[:limit]

# ==============================================================
# OBTENER WATCHLIST PROFESIONAL
# ==============================================================
def get_professional_watchlist(sample_size: int = 25):
    """
    Devuelve una muestra aleatoria pero de alta calidad de la Watchlist Institucional.
    Usado específicamente para el análisis de señales de trading (signals.py).
    """
    # Mezclamos la lista para que el orden de análisis varíe 
    shuffled_list = INSTITUTIONAL_WATCHLIST.copy()
    random.shuffle(shuffled_list)
    
    # Tomamos el tamaño de muestra solicitado
    selected_symbols = shuffled_list[:sample_size]
    
    logger.info(f"📊 Analizando {len(selected_symbols)} activos de la Watchlist Institucional")
    logger.debug(f"🎲 Activos seleccionados: {selected_symbols[:5]}...")
    
    return selected_symbols

# ==============================================================
# OBTENER SÍMBOLOS MÁS POPULARES
# ==============================================================
def get_top_6_popular():
    """
    Devuelve las 6 criptomonedas más populares y líquidas del mercado.
    Usado para el botón "Top 6 Criptos" del menú principal.
    """
    # Las 6 monedas con mayor capitalización y liquidez
    top_6 = [
        "BTC/USDT",  # Bitcoin
        "ETH/USDT",  # Ethereum
        "SOL/USDT",  # Solana
        "BNB/USDT",  # Binance Coin
        "XRP/USDT",  # Ripple
        "ADA/USDT"   # Cardano
    ]
    
    logger.info("📊 Top 6 Criptomonedas Populares: BTC, ETH, SOL, BNB, XRP, ADA")
    return top_6