from dataclasses import dataclass, field
from typing import List, Optional, Dict

@dataclass
class DBConfig:
    host: str = 'nlbotinterface.ru'
    port: int = 3306
    database: str = 'bitcoin_tickers'
    user: str = 'bitcoin'
    password: str = 'g49020007'
    charset: str = 'utf8mb4'
    pool_size: int = 5

@dataclass
class WaveStrategyConfig:
    # === Волновой анализ (адаптировано под акции) ===
    wave_lookback: int = 4000          # Меньше: акции имеют более короткие циклы
    wave_window: int = 30            # 🔑 Меньше окно: ловит локальные качели
    max_waves_for_avg: int = 5        # 🔑 Усредняем только по 3 последним волнам
    min_wave_atr_ratio: float = 0.8
    min_wave_distance_pct: float = 0.15    # Было 0.2: ловим только значимые волны

    # === ATR & Тренд ===
    atr_period: int = 14
    use_trend_filter: bool = True
    trend_ema_period: int = 50
    min_hold_bars: int = 3
    signal_cooldown_bars: int = 6
    
    # === Risk Management ===
    max_risk_percent: float = 0.02
    sl_atr_multiplier: float = 1.8    # 🔑 Меньше множитель: на акциях ATR уже «плотнее»
    risk_reward_ratio: float = 2.5    # 🔑 Снижено: для WR ~35% достаточно 1.8

    # === Фильтры входа ===
    max_entry_progress_pct: float = 30.0
    min_entry_progress_pct: float = 5.0  # Было 10: вход только в «сердце» волны
    min_volatility_pct: float = 0.5       # Не торговать, если ATR < 0.5% цены

    # === Трейлинг (ВЫКЛЮЧЕН) ===
    # === Фильтры торговли ===
    allow_short_positions: bool = False  # 🔑 Разрешить короткие позиции (SELL)
    # === Трейлинг ===
    trail_enabled: bool = False

    # === Настройки отчетности ===
    generate_reports: bool = True           # Генерировать расширенные отчеты
    save_charts: bool = True                # Сохранять графики
    report_format: str = 'html'             # 'html', 'pdf', 'both'
    charts_dpi: int = 150                   # Качество графиков
    chart_style: str = 'seaborn-v0_8'      # Стиль графиков

    # === Калькулятор ===
    risk_calc_type: str = 'percent'
    risk_calc_percent: float = 1.5    # 🔑 Меньше риск на сделку для акций
    position_lot_size: float = 1.0
    INITIAL_BALANCE: float = 10000.0

    TIMEFRAMES: Dict[str, Dict] = field(default_factory=lambda: {
        'H1': {'offset_minutes': 15, 'period_seconds': 3600},
        'D1': {'offset_minutes': 5, 'period_seconds': 86400},
    })
    LOG_LEVEL: str = 'WARNING'
    LOG_FILE: str = 'logs/trading_bot.log'

@dataclass
class OptimizationConfig:
    atr_periods: List[int] = field(default_factory=lambda: [10, 14, 20])
    sl_multipliers: List[float] = field(default_factory=lambda: [0.8, 1.0, 1.2])
    rr_ratios: List[float] = field(default_factory=lambda: [1.5, 1.8, 2.0])
    min_trades: int = 15
    min_win_rate: float = 35.0
    max_drawdown_pct: float = 15.0
    fitness_function: str = 'profit_factor'
    n_jobs: int = 1  # 🔑 Последовательно для отладки
    walk_forward: bool = False

DB_CONFIG = DBConfig()
WAVE_CONFIG = WaveStrategyConfig()
OPT_CONFIG = OptimizationConfig()