import os
from dotenv import load_dotenv

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
load_dotenv(os.path.join(BASE_DIR, '.env'))


class Config:
    # --- Database ---
    DB_CONFIG = {
        'host': os.getenv('DB_HOST', 'nlbotinterface.ru'),
        'port': int(os.getenv('DB_PORT', '3306')),
        'database': os.getenv('DB_NAME', 'bitcoin_tickers'),
        'user': os.getenv('DB_USER', 'bitcoin'),
        'password': os.getenv('DB_PASSWORD', ''),
    }

    # --- Instruments ---
    INSTRUMENTS = ['BITCOIN', 'EURUSD']
    TABLES = {instr: f'{instr}_H1' for instr in INSTRUMENTS}
    TIMEFRAME = 'H1'

    # --- Strategy parameters ---
    # Each strategy uses 'variant' to select which pre-computed indicator columns to use.
    # Strategies read config params for logic thresholds; columns are named by variant.
    STRATEGY_PARAMS = {
        'ema_rsi_trend': {
            'ema_fast': 9,
            'ema_slow': 21,
            'ema_variant': '9_21',
            'rsi_period': 14,
            'rsi_low': 30,               # original wide — better BTC wr
            'rsi_high': 70,
            'rsi_mid': 50,
            'require_prev_confirm': False,
            'min_cross_ratio': 0.0,
        },
        'bb_pa': {
            'bb_period': 20,
            'bb_std': 2.0,
            'bb_variant': '20_2',
            'min_shadow_ratio': 0.6,       # original — best BTC wr
            'use_atr_filter': False,
            'atr_median_lookback': 50,
            'quality_bounce': False,        # off — simple close>Open is more reliable
        },
        'rsi_divergence': {
            'rsi_period': 14,
            'div_lookback': 20,
            'div_variant': '20',
            'sr_variant': '20',
            'dynamic_confidence': False,
            'require_rsi_reversal': False,
            'rsi_bull_max': 40,          # RSI < 40 (improved from 52.4%→52.9%)
            'rsi_bear_min': 60,          # RSI > 60
        },
        'macd_stoch': {
            'macd_fast': 12,
            'macd_slow': 26,
            'macd_signal': 9,
            'stoch_k': 8,             # KEPT — best config so far
            'stoch_d': 3,
            'stoch_variant': '8_3',
            'stoch_oversold': 38,
            'stoch_overbought': 62,
            'macd_strict': False,
        },
        'breakout_retest': {
            'lookback': 20,
            'body_pct_min': 0.6,          # back to 0.6
            'use_atr_breakout': True,      # NEW: breakout candle must exceed ATR14
        },
    }

    # --- Expiry bars to test (1 = next H1 candle, 5 = 5-hour expiry) ---
    EXPIRY_BARS = [1, 2, 3, 4, 5]

    # --- Backtest config ---
    BACKTEST = {
        'initial_balance': 1000.0,
        'trade_amount': 100.0,
        'payout_pct': 0.80,
        'min_win_rate': 0.55,
        'min_profit_factor': 0.8,
        'min_trades': 50,
    }

    # --- Paths ---
    DATA_DIR = os.path.join(BASE_DIR, 'data')
    MODEL_DIR = os.path.join(BASE_DIR, 'models')
    REPORT_DIR = os.path.join(BASE_DIR, 'reports')
    PLOT_DIR = os.path.join(BASE_DIR, 'plots')

    @classmethod
    def setup_dirs(cls):
        for d in [cls.DATA_DIR, cls.MODEL_DIR, cls.REPORT_DIR, cls.PLOT_DIR]:
            os.makedirs(d, exist_ok=True)
