"""
Symbol Mapping and Conversion

Converts QuantDinger system symbols to IB contract format.
"""

from typing import Tuple, Optional


def normalize_symbol(symbol: str, market_type: str) -> Tuple[str, str, str]:
    """
    Convert system symbol to IB contract parameters.
    
    Args:
        symbol: Symbol code in the system
        market_type: Market type (USStock, HShare)
        
    Returns:
        (ib_symbol, exchange, currency)
    """
    symbol = (symbol or "").strip().upper()
    market_type = (market_type or "").strip()
    
    if market_type == "USStock":
        # US stocks: AAPL, TSLA, GOOGL
        # Use SMART routing for best execution
        return symbol, "SMART", "USD"
    
    elif market_type == "HShare":
        # Hong Kong stock formats:
        # - 0700.HK -> 700
        # - 00700 -> 700
        # - 700 -> 700
        ib_symbol = symbol
        
        # Remove .HK suffix
        if ib_symbol.endswith(".HK"):
            ib_symbol = ib_symbol[:-3]
        
        # Remove leading zeros
        ib_symbol = ib_symbol.lstrip("0") or "0"
        
        return ib_symbol, "SEHK", "HKD"
    
    else:
        # Default to US stock
        return symbol, "SMART", "USD"


def parse_symbol(symbol: str) -> Tuple[str, Optional[str]]:
    """
    Parse symbol and auto-detect market type.
    
    Args:
        symbol: Symbol code
        
    Returns:
        (clean_symbol, market_type)
    """
    symbol = (symbol or "").strip().upper()
    
    # HK stock: ends with .HK or all digits
    if symbol.endswith(".HK"):
        return symbol, "HShare"
    
    # All digits (likely HK stock code)
    clean = symbol.lstrip("0")
    if clean.isdigit() and len(clean) <= 5:
        return symbol, "HShare"
    
    # Default to US stock
    return symbol, "USStock"


def format_display_symbol(ib_symbol: str, exchange: str) -> str:
    """
    Convert IB contract format back to display format.
    
    Args:
        ib_symbol: IB symbol
        exchange: Exchange code
        
    Returns:
        Display symbol
    """
    if exchange == "SEHK":
        # HK stock: pad to 4 digits, add .HK
        padded = ib_symbol.zfill(4)
        return f"{padded}.HK"
    return ib_symbol
